簡體   English   中英

如何在wxPython中控制Grid的視口?

[英]How do I control the viewport of a Grid in wxPython?

我試圖在我的網格應用程序中實現查找功能。 我可以使用SetGridCursor(self, row, col)來移動光標,但是我不知道如何將網格的“視口”移動到新的光標位置。 換句話說,當光標移動到用戶正在尋找的單元格時,用戶仍然必須手動滾動直到找到光標單元格。

如何以編程方式滾動網格,以使網格光標在視口中居中?


在寫這個問題時,我隨意地去了Grid Wiki頁面,搜索單詞“ scroll”並發現:

MakeCellVisible( int row, int col ) —強制特定單元格可見,有效地滾動網格以使其成為給定單元格

這幾乎解決了我的問題。 我希望單元格在視口中居中,但是此功能只會滾動直到該單元格在屏幕邊緣可見為止。 我找不到任何只影響網格滾動位置而又不影響光標位置的函數。 思考?

在這種情況下,請看看wxWidgets (核心C ++庫)公開了哪些方法。 wxGrid子類wxScrolled wxScrolled公開了以下方法:

  • Scroll

    滾動窗口,使視圖開始於給定點。

  • GetVirtualSize

    獲取可滾動窗口區域的設備單位大小(與客戶端大小相對,客戶端大小是當前可見的窗口區域)。

我認為您可以使用這些方法來計算可滾動窗口的中心坐標。 現在,您需要的是您要居中的單元格的坐標。 wxGrid公開了此方法:

  • CellToRect

    在邏輯坐標中返回與網格單元的大小和位置相對應的矩形。

現在,在C ++中,您可以將wxGrid轉換為wxScrolled並調用所需的方法。 但是, wxPython並不總是公開wxWidgets可用的所有方法,因此在這里您必須使用未綁定的方法來獲得一些創意。 下面是一些偽代碼,未經測試,但應為您提供有關如何執行此操作的想法。

 grid = wx.Grid() cell_coords = grid.CellToRect(12,12) # get the virtual size by calling it as unbound method virtual_size = wx.Scrolled.GetVirtualSize(grid) # calculate the upper-left coordinate scroll_coords = (cell_coords.x - virtual_size.width / 2, cell_coords.y - virtual_size.height / 2) # call Scroll as unbound method wx.Scrolled.Scroll(grid, scroll_coords) 

這對我來說適用於垂直滾動,以將網格光標保持在頁面中間:

def set_grid_cursor(grid, irow, icol):
    # move the cursor to the cell as usual
    grid.GoToCell(irow, icol)
    # scroll to keep irow in the middle of the page
    ppunit = grid.GetScrollPixelsPerUnit()
    cell_coords = grid.CellToRect(irow, icol)
    y = cell_coords.y / ppunit[1]  # convert pixels to scroll units
    scrollPageSize = grid.GetScrollPageSize(wx.VERTICAL)
    scroll_coords = (0, y - scrollPageSize / 2)
    grid.Scroll(scroll_coords)

如果您只是更新了網wx.CallAfter(set_grid_cursor, grid, irow, icol)可能必須使用wx.CallAfter(set_grid_cursor, grid, irow, icol)來調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM