Как в wxPython связать событие EVT_KEY_DOWN со всем окном?

Я могу связать событие с полем 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)

Я почти уверен, что упускаю что-то простое. Однако я немного застрял.

16
задан Oded 10 May 2011 в 19:00
поделиться

2 ответа

Вместо этого попробуйте выполнить привязку к 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()
19
ответ дан 30 November 2019 в 21:53
поделиться

Вы можете использовать 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)

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

4
ответ дан 30 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: