wxpython捕获wx.Frame中的键盘事件

Kev*_*vin 5 python wxwidgets wxpython

我正在尝试捕获在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()
Run Code Online (Sandbox Code Playgroud)

如果有人知道如何做到这一点,我将不胜感激.

Kev*_*vin 7

我发现我可以在框架中添加一个面板,面板更容易接受键盘事件.

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()
Run Code Online (Sandbox Code Playgroud)


joa*_*uin 3

如果您使用 log.warning,您的代码就可以工作。

log.warning("OnKeyDown event %s" % (event))
Run Code Online (Sandbox Code Playgroud)

日志记录级别为:

Level    Value
CRITICAL  50
ERROR     40
WARNING   30
INFO      20
DEBUG     10
UNSET      0
Run Code Online (Sandbox Code Playgroud)

默认日志记录级别为警告。仅生成级别高于默认级别的日志。因此,在默认级别 (30) 下,既不会log.info也不log.debug产生任何输出。

在OP评论后编辑:设置正确的日志记录级别使您的代码可以在带有python 2.6和wxpython 2.8.11和2.8.12的winXP 32位和win7 64位上完美运行。然而,出于某种我不知道的原因,该代码在 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()
Run Code Online (Sandbox Code Playgroud)