我有一个带行/列等的wxPython网格(wx.grid)类。我正在尝试检测用户何时在特定单元格上执行“Control + Click”。现在我有:
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"
只需单击单元格即可正常工作,但当我执行Control + Click时,此事件甚至不会触发。
如何绑定此事件?
答案 0 :(得分:1)
Grid类已经在处理Ctrl-Click事件以实现将单元格添加到所选单元格的集合中。由于网格已经为此目的消耗了该事件,因此事件不会传播或转换为网格事件(选择事件除外)。但是,您可以在网格获取之前拦截较低级别的鼠标事件,并在那里进行检查。尝试将处理程序直接绑定到Grid的网格窗口组件,如下所示:
self.GetGridWindow().Bind(wx.EVT_LEFT_UP, self.onLeftUp)
请务必在鼠标事件处理程序中调用event.Skip(),以便Grid仍可以获取并处理该事件。
您不必担心捕获此事件的关键事件,因为传递给鼠标事件处理程序的事件对象包括在鼠标事件发生时获取修改键的状态的方法。
答案 1 :(得分:0)
我认为你需要绑定到EVT_KEY_DOWN和EVT_KEY_UP。在按键事件中,将一些变量设置为“self.ctrl”为True。在up事件中,将其设置为False。您最初可能应该将其设置为False。然后当它按下时,它变为True,只要你调用event.Skip(),你的网格事件就会在你点击时触发。无论如何,这些方面都应该有效。
这可以帮助您更好地了解关键事件:http://www.blog.pythonlibrary.org/2009/08/29/wxpython-catching-key-and-char-events/
别介意这个答案 - >见罗宾邓恩的