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

如何在wxPython中控制栅格的视口?,python,wxpython,wxwidgets,wxgrid,Python,Wxpython,Wxwidgets,Wxgrid,我正在尝试在我的网格应用程序中实现查找功能。我可以使用SetGridCursor(self,row,col)移动光标,但我不知道如何将网格的“视口”移动到新的光标位置。换句话说,当光标移动到用户正在查找的单元格时,用户仍然必须手动滚动,直到找到光标单元格为止 如何以编程方式滚动栅格,使栅格光标在视口中居中 在写这个问题时,我随机进入Grid wiki页面,搜索“滚动”一词,发现: MakeCellVisible(int行,int列)强制特定单元格可见,有效地将网格滚动到给定单元格 这几乎解决了

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

如何以编程方式滚动栅格,使栅格光标在视口中居中


在写这个问题时,我随机进入Grid wiki页面,搜索“滚动”一词,发现:

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


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

在这样的情况下,看看哪些代码被“代码> WxWistGe< /Cuo>(核心C++库)所暴露。子类
wxScrolled
公开了以下方法:

  • 滚动窗口,使视图开始于给定点

  • 获取可滚动窗口区域的大小(以设备为单位)(与客户端大小相反,客户端大小是窗口当前可见的区域)

我认为您可以使用这些方法来计算可滚动窗口的中心坐标。现在,你需要的是你想要居中的单元格的坐标
wxGrid
公开了此方法:

  • 返回与逻辑坐标中网格单元的大小和位置相对应的矩形
现在,在C++中,您将把<代码> WXGrase<代码>转换为<代码> WxScR卷pS/<代码>,并调用所需的方法。然而,
wxPython
并不总是公开
wxWidgets
中可用的所有方法,因此这里是使用未绑定方法的一点创新之处。下面是一些未经测试的伪代码,但应该会让您了解如何做到这一点


在这样的情况下,看看哪些代码被“代码> WxWistGe< /Cube >(核心C++库)所公开。子类

wxScrolled
公开了以下方法:

  • 滚动窗口,使视图开始于给定点

  • 获取可滚动窗口区域的大小(以设备为单位)(与客户端大小相反,客户端大小是窗口当前可见的区域)

我认为您可以使用这些方法来计算可滚动窗口的中心坐标。现在,你需要的是你想要居中的单元格的坐标
wxGrid
公开了此方法:

  • 返回与逻辑坐标中网格单元的大小和位置相对应的矩形
现在,在C++中,您将把<代码> WXGrase<代码>转换为<代码> WxScR卷pS/<代码>,并调用所需的方法。然而,
wxPython
并不总是公开
wxWidgets
中可用的所有方法,因此这里是使用未绑定方法的一点创新之处。下面是一些未经测试的伪代码,但应该会让您了解如何做到这一点


<>这对我来说是垂直滚动,以使网格光标保持在页面中间:

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(StIGGRIDIGURE游标,GRID,IROL,ICOL)< /C> >如果您刚刚更新网格。

< P>这对我来说是垂直滚动的,以保持网格光标在页面的中间:

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\u grid\u cursor,grid,irow,icol)
调用它。

我无法理解此代码和滚动机制,但它可以工作。ThanksI未能理解此代码和滚动机制,但它可以工作。谢谢