我有一个带网格的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列):
以下是所需的行为:
如果需要,我很乐意提供更多代码。我想做以下其中一项。一,以某种方式迫使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()。
答案 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