将面板添加到框架时,不会调用wxPython EVT_CHAR

时间:2013-09-06 14:32:07

标签: 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()
        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的绑定。

如何解决此问题?我在代码中做错了吗?

2 个答案:

答案 0 :(得分:2)

问题是您正在捕捉帧中发生的事件,但帧不在焦点上。按钮是。在wxPython中,事件以焦点的形式发送到窗口小部件。如果您将其添加到 init 的末尾,则可以:

self.SetFocus()

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

答案 1 :(得分:1)

我很欣赏这个问题在2年前得到了回答,但是这个问题在某些时候或其他方面引起了我们的注意 它是对wx.Event或wx.CommandEvent问题的经典绑定 在这种情况下,只需将self.Bind(wx.EVT_CHAR, self.character)行更改为阅读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.Bind