[英]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
公開了以下方法:
滾動窗口,使視圖開始於給定點。
獲取可滾動窗口區域的設備單位大小(與客戶端大小相對,客戶端大小是當前可見的窗口區域)。
我認為您可以使用這些方法來計算可滾動窗口的中心坐標。 現在,您需要的是您要居中的單元格的坐標。 wxGrid
公開了此方法:
CellToRect
在邏輯坐標中返回與網格單元的大小和位置相對應的矩形。
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.