2010-08-25 58 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。

相關問題