繁体   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