我可以将事件绑定到textctrl框np。问题是我必须在textctrl框内单击以“捕获”此事件。我希望能够在主窗口具有焦点时随时按下箭头键。
不工作:
wx.EVT_KEY_DOWN(self, self.OnKeyDown)
WORKING:
self.NudgeTxt = wx.TextCtrl(self.panel, size=(40,20), value=str(5))
wx.EVT_KEY_DOWN(self.NudgeTxt, self.OnKeyDown)
我很确定我错过了一些简单的事情。但是我有点卡住了。
答案 0 :(得分: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()
答案 1 :(得分: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。