wxpython事件顺序

时间:2014-10-14 01:56:49

标签: python grid wxpython wxgrid

我有一个带网格的wxPython gui。当用户点击某些单元格时,会弹出一个下拉菜单。

self.window.Bind(wx.grid.EVT_GRID_SELECT_CELL, lambda event: self.on_left_click(event, self.grid, choices), self.grid)

方法on_left_click拉出下拉菜单并按预期工作。问题是我希望wx.grid.EVT_GRID_SELECT_CELL的默认行为首先发生 ,然后我的自定义方法要触发。通常,当您单击网格单元格时,该单元格的边框变为粗体。使用我的绑定,我的下拉菜单首先出现,只有在下拉菜单被解除后才会选中单元格边框。我尝试调用self.grid.SetGridCursor(row,col),但是会生成一个wx.grid.EVT_GRID_SELECT_CELL事件,这会导致递归最大化并且显然不好。我也尝试在on_left_click代码中使用event.Skip(),但它似乎没有效果。

这是一种尴尬,令人反感的行为(我只是点击第0行,第2列):grid looking all weird

以下是所需的行为:grid looking more appropriate

如果需要,我很乐意提供更多代码。我想做以下其中一项。一,以某种方式迫使wxPython完全处理wx.grid.EVT_GRID_SELECT_CELL,然后再转到我的自定义下拉菜单。二,手动复制"突出显示"我自己的代码中选定的单元格。

提前感谢您的帮助。

编辑:

这是我最终做的事情。

代替wx.grid.EVT_GRID_SELECT_CELL,我使用wx.grid.EVT_GRID_CELL_LEFT_CLICK,当用户点击网格单元时,它本质上是第一个事件,所以我可以完全自定义初始点击后的行为。然后,我可以使用它:

    self.grid.SetGridCursor(row, col)

概述单元格而不创建无限递归错误,以及实现一堆现在更顺畅的其他行为。我还需要使用self.grid.Refresh()。

1 个答案:

答案 0 :(得分:0)

创建一个单独的方法来显示下拉菜单,并使用wx.CallAfter调用它。

def on_left_click(self, event, grid, choices):
    event.Skip()
    self.grid.Refresh()
    wx.CallAfter(self.showMenu, grid=grid, choices=choices)


def showMenu(self, grid=None, choices=None):
    # Drop down menu code goes here