wxpython在wx.Fram中捕获键盘事件

2024-05-19 12:04:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图捕获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()

如果有人知道怎么做,我会感激你的帮助。


Tags: 代码importselfeventlogtitleinitbind
2条回答

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

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()

如果使用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都不会产生任何输出。

在操作注释后编辑:设置正确的日志级别可以使代码在使用Python2.6和Wxpython2.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()

相关问题 更多 >

    热门问题