Я могу связать событие с полем textctrl np. Проблема в том, что я должен щелкнуть внутри поля textctrl, чтобы «поймать» это событие. Я надеюсь, что смогу поймать в любое время, когда кто-то нажимает клавиши со стрелками, когда главное окно находится в фокусе.
НЕ РАБОТАЕТ:
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)
Я почти уверен, что упускаю что-то простое. Однако я немного застрял.
Вместо этого попробуйте выполнить привязку к wx.EVT_CHAR_HOOK
например,
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()
Вы можете использовать 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)
, вам нужно будет использовать кнопку или идентификатор виджета в таблице ускорителей, и нажатие кнопки вызовет обработчик событий виджетов.
Если у вас нет виджетов, события которых должны запускаться, и вы предпочитаете какой-то «невидимый» виджет с привязкой к событиям, то вы можете сделать следующее:
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)
Я перебираю интересующие ключи, чтобы привязать к ним и создать для них новые идентификаторы виджетов. Затем я использую эти идентификаторы для привязки элементов меню (с которыми запускаются клавиши-ускорители) и использую эти идентификаторы в списке кортежей в таблице-ускорителе.