[英]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.