wxpython захватывает события клавиатуры в wx.Frame - PullRequest
5 голосов
/ 03 января 2012

Я пытаюсь захватить события клавиатуры, которые происходят внутри wx.Frame, и я ожидаю, что следующий код захватит эти события.Однако при запуске кода обработчик OnKeyDown никогда не вызывается:

import logging as log
import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.Bind(wx.EVT_KEY_UP, self.OnKeyDown)
        self.Bind(wx.EVT_CHAR, self.OnKeyDown)
        self.SetFocus()
        self.Show(True)

    def OnKeyDown(self, event=None):
        log.debug("OnKeyDown event %s" % (event))

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    app.MainLoop()

Если кто-нибудь знает, как это сделать, я был бы признателен за помощь.

Ответы [ 2 ]

6 голосов
/ 03 января 2012

Я понял, что могу добавить панель к кадру, и панель гораздо более восприимчива к событиям клавиатуры.

import wx

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))

        self.panel = wx.Panel(self, wx.ID_ANY)
        self.panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        self.panel.Bind(wx.EVT_KEY_UP, self.OnKeyDown)
        self.panel.Bind(wx.EVT_CHAR, self.OnKeyDown)
        self.panel.SetFocus()
        self.Show(True)

    def OnKeyDown(self, event=None):
        print "Event!"

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    app.MainLoop()
3 голосов
/ 03 января 2012

Ваш код работает, если вы используете log.warning.

log.warning("OnKeyDown event %s" % (event))

Уровни ведения журнала:

Level    Value
CRITICAL  50
ERROR     40
WARNING   30
INFO      20
DEBUG     10
UNSET      0

Уровень ведения журнала по умолчанию - ПРЕДУПРЕЖДЕНИЕ. Только журналы с уровнями выше, чем по умолчанию создаются. Таким образом, на уровне по умолчанию (30) ни log.info, ни log.debug не дают никакого вывода.

Отредактировано после комментариев OP : установка правильного уровня ведения журнала делает ваш код безупречным на winXP 32bit и win7 64bit с python 2.6 и wxpython 2.8.11 и 2.8.12. Однако код не работает в Ubuntu по какой-то причине, которую я не знаю. Это различие связано с тем, как wxwidgets реализован в разных SO, но не с ведением журнала. Как вы уже обнаружили, для того, чтобы он работал в Ubuntu, необходимо добавить панель, а также использовать соответствующий уровень ведения журнала. Так что это работает:

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        self.panel =  wx.Panel(self, wx.ID_ANY)
        self.Bind(wx.EVT_KEY_DOWN, self.KeyDown)
        self.Bind(wx.EVT_KEY_UP, self.KeyDown)
        self.Bind(wx.EVT_CHAR, self.KeyDown)
        self.panel.SetFocus()

    def KeyDown(self, event=None):
        logging.warning("OnKeyDown event %s" % (event))

if __name__ == "__main__":
    app = wx.App(False)
    gui = MainWindow(None, "test")
    gui.Show()
    app.MainLoop()
...