В wxPython как связать событие EVT_KEY_DOWN со всем окном? - PullRequest
15 голосов
/ 26 августа 2010

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

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

Ответы [ 2 ]

18 голосов
/ 26 августа 2010

Вместо этого попробуйте связать с 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()
4 голосов
/ 26 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...