【问题标题】:wxpython Event orderwxpython 事件顺序
【发布时间】:2014-12-08 16:46:05
【问题描述】:

我有一个带有网格的 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_CELL_LEFT_CLICK 代替 wx.grid.EVT_GRID_SELECT_CELL,它本质上是当用户单击网格单元时触发的 first 事件,因此我可以完全自定义初始点击后的行为。然后,我可以使用这个:

    self.grid.SetGridCursor(row, col)

在不产生无限递归错误的情况下勾勒出单元格的轮廓,以及实现一系列现在工作更顺利的其他行为。我还需要使用 self.grid.Refresh()。

【问题讨论】:

    标签: python grid wxpython wxgrid


    【解决方案1】:

    创建一个单独的方法来显示下拉菜单并使用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
    

    【讨论】:

      猜你喜欢
      • 2012-08-25
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多