将面板添加到帧时未调用wxPython EVT_CHAR

将面板添加到帧时未调用wxPython EVT_CHAR,python,wxpython,Python,Wxpython,我需要为我正在使用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()

我需要为我正在使用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()
从未调用character函数。然而,当我注释掉对框架构造函数的两行调用时,调用了I character函数。向帧添加面板似乎会干扰帧的EVT_字符的绑定


我如何解决这个问题?我的代码中是否有错误?

问题是您正在捕获发生在帧上的事件,但帧不在焦点中。按钮是。在wxPython中,事件被发送到焦点中的小部件。如果将此项添加到初始化的末尾,则它将起作用:

self.SetFocus()
但是,如果您将焦点更改为按钮,则它将再次停止工作。另见:


问题在于,您正在捕获发生在帧上的事件,但帧未处于焦点。按钮是。在wxPython中,事件被发送到焦点中的小部件。如果将此项添加到初始化的末尾,则它将起作用:

self.SetFocus()
但是,如果您将焦点更改为按钮,则它将再次停止工作。另见:


我很感激这个问题在两年前得到了回答,但这个问题在某个时候吸引了我们所有人。
这是wx.Event或wx.CommandEvent问题的经典绑定。
在这种情况下,只需将
self.Bind(wx.EVT\u CHAR,self.character)
行更改为读取
button.Bind(wx.EVT\u CHAR,self.character)
即可解决上述问题。
wx.Event-wx.CommandEvent的问题在这里有完整的介绍:

这里:

我很感激这个问题在两年前得到了回答,但这个问题在某种程度上吸引了我们所有人。
这是wx.Event或wx.CommandEvent问题的经典绑定。
在这种情况下,只需将
self.Bind(wx.EVT\u CHAR,self.character)
行更改为读取
button.Bind(wx.EVT\u CHAR,self.character)
即可解决上述问题。
wx.Event-wx.CommandEvent的问题在这里有完整的介绍:

这里: