Events wxPython网格控制&x2B;点击

Events wxPython网格控制&x2B;点击,events,grid,wxpython,Events,Grid,Wxpython,我有一个wxpythongrid(wx.grid)类,它包含行/列等。我试图检测用户何时对特定单元格执行“控制+单击”。现在我有: def __init__(self, parent, size): grd.Grid.__init__(self, parent, -1, size=size) self.control_button_pressed = False self.Bind(grd.EVT_GRID_CELL_LEFT_CLICK, self._OnSelect

我有一个wxpythongrid(wx.grid)类,它包含行/列等。我试图检测用户何时对特定单元格执行“控制+单击”。现在我有:

def __init__(self, parent, size):
    grd.Grid.__init__(self, parent, -1, size=size)
    self.control_button_pressed = False

    self.Bind(grd.EVT_GRID_CELL_LEFT_CLICK, self._OnSelectedCell)
    self.Bind(wx.EVT_KEY_DOWN, self._OnKeyPress)
    self.Bind(wx.EVT_KEY_UP, self._OnKeyUp)

def _OnKeyPress(self, event):
    self.control_button_pressed = True
    event.Skip()

def _OnKeyLift(self, event):
    self.control_button_pressed = False

def _OnSelectedCell(self, event):
    print "Cell Selected"
这在单击单元格时效果很好,但当我执行控件+单击时,此事件甚至不会触发


如何绑定此事件?

我认为您需要绑定到EVT_KEY_DOWN和EVT_KEY_UP。在key down事件中,将一些变量(如“self.ctrl”)设置为True。在up事件中,将其设置为False。您可能最初也应该将其设置为False。然后当它被按下时,它变为真,只要调用event.Skip(),网格事件就会在单击时触发。无论如何,沿着这些思路的东西应该是可行的

这可能有助于您更好地理解关键事件:


不要在意这个答案-->请参阅Robin Dunn的

Grid类已经在处理Ctrl-Click事件,以实现将单元格添加到选定单元格集合中。由于网格已为此目的使用该事件,因此该事件不会传播或转换为网格事件(选择事件除外)。但是,您可以在网格获取较低级别的鼠标事件之前拦截它们,并在那里执行检查。尝试将处理程序直接绑定到网格的网格窗口组件,如下所示:

self.GetGridWindow().Bind(wx.EVT_LEFT_UP, self.onLeftUp)
确保在鼠标事件处理程序中调用event.Skip(),以便网格仍然可以获取和处理事件


您不必担心捕捉该事件的关键事件,因为传递给鼠标事件处理程序的事件对象包括获取鼠标事件发生时修改器关键点状态的方法。

我已经更新了上述代码以遵循您的建议,当我按住鼠标时,它仍然不会捕捉单元格单击控制键。我设置了上面的确切代码,并定义了
onLeftUp(self,event):
与打印和
event.Skip()
-但我仍然遇到同样的问题。当我按下控制键时,它从不记录点击(什么也没有发生)。但是,我相信这是正确的,因为Shift键确实有效-Grid类必须在其他地方处理Ctrl+Click,我只想覆盖它。