Вы можете использовать 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)
Я перебираю интересующие ключи для привязки и создаю для них новые идентификаторы виджетов.Затем я использую эти идентификаторы для привязки пунктов меню (к которым запускаются клавиши акселератора) и использую эти идентификаторы в списке кортежей таблицы акселераторов.