1

我需要为使用 wxPython 开发的 GUI 应用程序绑定 EVT_CHAR 事件。我尝试了以下方法,但我无法理解代码的行为。

import wx
import wx.lib.agw.flatnotebook as fnb

class DemoApp(wx.App):

    def __init__(self):
        wx.App.__init__(self, redirect=False)

        self.mainFrame = DemoFrame()
        self.mainFrame.Show()

    def OnInit(self):
        return True


class DemoFrame(wx.Frame):

    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, wx.ID_ANY,
                          "FlatNotebook Tutorial",
                          size=(600,400)
                          )
        panel = wx.Panel(self)
        button = wx.Button(panel, label="Close", pos=(125, 10), size=(50, 50))

        self.Bind(wx.EVT_CHAR, self.character)

    def character(self, event):  
        print "Char keycode : {0}".format(event.GetKeyCode())

if __name__ == "__main__":
    app = DemoApp()
    app.MainLoop()

字符函数永远不会被调用。但是,当我注释掉对 Frame 构造函数的两行调用时,我调用了字符函数。向框架添加面板似乎会干扰框架的 EVT_CHAR 的绑定。

我该如何解决这个问题?我在我的代码中做错了吗?

4

2 回答 2

3

问题是您正在捕捉发生在框架上的事件,但框架不在焦点上。按钮是。在 wxPython 中,事件被发送到焦点所在的小部件。如果将其添加到init的末尾,它会起作用:

self.SetFocus()

但是,如果您将焦点更改为按钮,那么它将再次停止工作。也可以看看:

于 2013-09-06T16:09:52.247 回答
2

我很欣赏这个问题在 2 年前得到了回答,但是这个问题在某个时候让我们所有人都感到困惑。
它是 wx.Event 或 wx.CommandEvent 问题的经典绑定。
在这种情况下,只需将self.Bind(wx.EVT_CHAR, self.character)行更改为 read即可button.Bind(wx.EVT_CHAR, self.character)解决问题,详见上文。
wx.Event - wx.CommandEvent 的问题在此处完整介绍:
http
://wiki.wxpython.org/EventPropagation 和此处:
http ://wiki.wxpython.org/self.Bind%20vs.%20self.button .绑定

于 2015-09-14T08:13:57.983 回答