2013-01-10 26 views
0

我試圖實現在我的網格應用程序中查找功能。我可以使用SetGridCursor(self, row, col)移動光標,但我無法弄清楚如何將網格的「視口」移動到新的光標位置。換句話說,當光標移動到用戶正在尋找的單元格時,用戶仍然需要手動滾動,直到找到光標單元。如何在wxPython中控制網格的視口?

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


通過隨機的,在寫這個問題,我去了電網wiki頁面,搜索詞「滾動」,結果發現:

MakeCellVisible(int row, int col) - 強制特定的細胞可見,有效地工作滾動網格給予細胞

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

回答

3

在這樣的情況下,看看wxWidgets(核心C++庫)公開哪些方法。 wxGrid小類wxScrolledwxScrolled公開這些方法:

  • 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) 
2

這對我的作品垂直滾動,以保持電網光標在頁面中間:

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)如果你剛剛更新的網格。

+0

我不明白這段代碼和滾動機制,但它的工作原理。謝謝 – Himura