【问题标题】:wxPython EVT_CHAR not called when a panel is added to a frame将面板添加到框架时未调用 wxPython EVT_CHAR
【发布时间】:2013-09-06 14:32:06
【问题描述】:

我需要为使用 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 的绑定。

我该如何解决这个问题?我的代码有问题吗?

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

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

    self.SetFocus()
    

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

    【讨论】:

      【解决方案2】:

      我很感激这个问题在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 2018-01-13
        相关资源
        最近更新 更多