如何在wxPython中控制网格的视口?

时间:2013-01-10 11:43:22

标签: python wxpython wxwidgets wxgrid

我正在尝试在网格应用程序中实现查找功能。我可以使用SetGridCursor(self, row, col)移动光标,但我无法弄清楚如何将网格的“视口”移动到新的光标位置。换句话说,当光标移动到用户正在查找的单元格时,用户仍然需要手动滚动,直到找到光标单元格。

如何以编程方式滚动网格,以便将网格光标置于视口中心?


随机地,在写这个问题时,我去了网格维基页面,搜索“滚动”这个词,发现:

  

MakeCellVisible( int row, int col ) - 强制特定单元格可见,有效地将网格滚动到给定单元格

这几乎解决了我的问题。我希望单元格在视口中居中,但此功能仅滚动直到单元格在屏幕边缘可见。我找不到任何只影响网格滚动位置的功能而不影响光标位置。想法?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)来调用它。