2010-08-25 44 views
15

我可以将一个事件绑定到一个textctrl框np。问题是我必须在textctrl框内单击以“捕捉”此事件。我希望在主窗口有焦点时能随时按下箭头键。在wxPython中,如何将EVT_KEY_DOWN事件绑定到整个窗口?

不工作:

wx.EVT_KEY_DOWN(self, self.OnKeyDown) 

工作:

self.NudgeTxt = wx.TextCtrl(self.panel, size=(40,20), value=str(5)) 
wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown) 

我敢肯定,我失去了一些东西很容易。但是有点卡住了。

+0

对不起,您如何将按键事件绑定到文本框?因为这正是我需要的! 'wx.EVT_KEY_DOWN(self.NudgeTxt,self.OnKeyDown)'似乎并没有为我工作 – phunehehe 2010-11-09 08:15:47

回答

18

而是试图结合wx.EVT_CHAR_HOOK

e.g ..

self.Bind(wx.EVT_CHAR_HOOK, self.onKey) 

    ... 

def onKey(self, evt): 
    if evt.GetKeyCode() == wx.WXK_DOWN: 
     print "Down key pressed" 
    else: 
     evt.Skip() 
+0

感谢volting。那样做了。 – ril3y 2010-08-27 12:27:47

+0

@ ril3y:您的欢迎! – volting 2010-08-27 12:58:32

+0

这允许我的主窗口看到事件,但我的孩子看不到它。我所有的处理程序都包含event.Skip()。有什么建议么? – kjgregory 2015-10-23 15:05:25

4

你可以使用EVT_CHAR_HOOK,

self.Bind(wx.EVT_CHAR_HOOK, self.hotkey) 


def hotkey(self, event): 
    code = event.GetKeyCode() 
    if code == wx.WXK_LEFT: # or whatever... 
     ... 

,或者使用加速器表

ac = [(wx.ACCEL_NORMAL, wx.WXK_LEFT, widget.GetId())] 
    tbl = wx.AcceleratorTable(ac) 
    self.SetAcceleratorTable(tbl) 

你会ñ在加速器表中使用按钮或小部件的ID,按下按钮将触发小部件的事件处理程序。

如果你没有小工具,你想他们的事件被触发,而宁愿某种“隐形”窗口小部件有事件绑定,那么你可以这样做:

ac = [] 
    keys = [wx.WXK_LEFT, wx.WXK_RIGHT, wx.WXK_UP, wx.WXK_DOWN] 
    for key in keys: 
     _id = wx.NewId() 
     ac.append((wx.ACCEL_NORMAL, key, _id)) 
     self.Bind(wx.EVT_MENU, self.your_function_to_call, id=_id) 

    tbl = wx.AcceleratorTable(ac) 
    self.SetAcceleratorTable(tbl) 

我遍历在感兴趣的键上进行绑定,并为它们创建新的小部件ID。然后,我使用这些ID将菜单项绑定到(哪些加速键触发),并在加速器表的元组列表中使用这些ID。

相关问题