我需要为使用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的绑定。
如何解决此问题?我在代码中做错了吗?
答案 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