我正在尝试捕获在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()
如果有人知道如何做到这一点,我将不胜感激。
答案 0 :(得分:6)
我发现我可以在框架中添加一个面板,而面板更容易接受键盘事件。
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()
答案 1 :(得分:3)
如果您使用log.warning,则代码可以正常运行。
log.warning("OnKeyDown event %s" % (event))
记录级别为:
Level Value
CRITICAL 50
ERROR 40
WARNING 30
INFO 20
DEBUG 10
UNSET 0
默认日志记录级别为WARNING。仅生成级别高于默认级别的日志。因此,在默认级别(30),log.info
和log.debug
都不会产生任何输出。
在OP评论后编辑:设置正确的日志记录级别使您的代码在winXP 32位和win7 64位上运行完美,使用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()