我是一个相对有经验的 wxPython 用户,但在 wxPython 如何处理将多个事件处理程序绑定到同一个事件时总是遇到麻烦(我知道我是笼统的,希望下面的示例更具体)。这不是 wxPython 社区中通常提到的“事件传播”的问题。
这是示例代码(如果结果不正确:我无法弄清楚论坛的代码块系统):
import wx
class MainFrame(wx.Frame):
def __init__(self, parent, ID, title):
wx.Frame.__init__(self, parent, ID, title,
wx.DefaultPosition, wx.Size(200, 100))
Panel = wx.Panel(self, -1)
TopSizer = wx.BoxSizer(wx.VERTICAL)
Panel.SetSizer(TopSizer)
Text = wx.TextCtrl(Panel, -1, "Type text here")
TopSizer.Add(Text, 1, wx.EXPAND)
Text.Bind(wx.EVT_KEY_DOWN,self.OnKeyText)
Text.Bind(wx.EVT_KEY_DOWN, self.OnKeyText2)
def OnKeyText(self, event):
print "OnKeyText"
event.Skip()
def OnKeyText2(self, event):
print "OnKeyText2"
event.Skip()
class MyApp(wx.App):
def OnInit(self):
Frame = MainFrame(None, -1, "Event Order Demo")
Frame.Show(True)
self.SetTopWindow(Frame)
return True
if __name__ == '__main__':
App = MyApp(0)
App.MainLoop()
函数“OnKeyText2”首先被执行,所以我计算了“事件堆栈”的行为(对于 wxPython 的这一部分是否有适当的术语而不是“事件堆栈”?)对于这个控件是:每个新的处理程序绑定到相同传播级别的相同事件进入堆栈顶部(首先执行)而不是底部(第二个执行)。
尽管我理解这一点,但它在我的应用程序中已经成为一个真正的痛苦,因为我有一个类的子类,其中基类函数绑定一些事件,然后子类绑定它们的附加事件后记。
我觉得事件被倒退到“事件堆栈”中(首先绑定你想要最后发生的事件)。有没有办法让事件附加到“事件堆栈”而不是在开头插入?
如果我误解了 event.Skip() 命令或遗漏了什么,请告诉我!:) 有没有更好的方法来做我想做的事情?我不想将事件串在一起(例如:有 OnKeyText(),一旦完成,调用 OnKeyText2()),因为在我的应用程序中,一个事件处理程序由所有子类共享,而另一个不是。
如果答案是“只需要以相反的顺序完成”,那么我将不得不接受这一点并对我的应用程序进行更改。
如果答案是我应该使用控件和面板之间的事件传播来控制事件处理程序的顺序,我觉得我遇到了同样的问题,除非我将每个传播级别的事件处理程序的数量保持为一个。
提前致谢!本杰明