2011-12-01 59 views
0

我有一个wxPython的网格(wx.grid)类具有行/列并且这样。我试图检测用户何时在特定单元格上执行“Control + Click”。现在,我有:wxPython的网格控制+点击

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" 

能正常工作时,只需点击该单元格,但是当我执行控制+点击,该事件不会做甚至引起火灾。

我怎么能结合这个活动?

回答

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/

没关系这个答案 - >见罗宾邓恩的

+0

我已经更新上面的代码按你说的,它仍然不会捕获当我按住Ctrl键单击单元格。 – lightningmanic

1

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

self.GetGridWindow().Bind(wx.EVT_LEFT_UP, self.onLeftUp) 

一定要调用event.Skip()在你的鼠标事件处理程序,以便网格仍然可以获取和处理事件。

您不必担心醒目的关键事件是因为传递给鼠标事件处理事件对象包括在鼠标事件发生的时间去修改键的状态的方法。

+0

我设置你上面有确切的代码,并且定义'onLeftUp(个体经营,事件):'与打印和'event.Skip()' - 但我仍然在运行到同样的问题。当我按住Control键时,它从不记录点击(没有发生)。不过,我认为这是正确的轨道,因为Shift键确实有效 - Grid类必须在其他地方处理Ctrl + Click,我只是想重写它。 – lightningmanic