wxPython:同一事件传播级别上同一事件的多个处理程序的事件处理顺序
我是一个相对有经验的wxPython用户,但在wxPython如何处理将多个事件处理程序绑定到同一个事件方面总是有困难(我知道我是一般性的,希望下面的示例更具体)。这不是wxPython社区通常提到的“事件传播”问题 下面是示例代码(如果它没有正确显示:我很难为论坛找到代码块系统):wxPython:同一事件传播级别上同一事件的多个处理程序的事件处理顺序,wxpython,Wxpython,我是一个相对有经验的wxPython用户,但在wxPython如何处理将多个事件处理程序绑定到同一个事件方面总是有困难(我知道我是一般性的,希望下面的示例更具体)。这不是wxPython社区通常提到的“事件传播”问题 下面是示例代码(如果它没有正确显示:我很难为论坛找到代码块系统): 函数“OnKeyText2”首先执行,因此我计算了该控件的“事件堆栈”(wxPython的这部分是否有合适的术语而不是“事件堆栈”?)的行为:在相同传播级别绑定到同一事件的每个新处理程序都会到达堆栈的顶部(首先执
函数“OnKeyText2”首先执行,因此我计算了该控件的“事件堆栈”(wxPython的这部分是否有合适的术语而不是“事件堆栈”?)的行为:在相同传播级别绑定到同一事件的每个新处理程序都会到达堆栈的顶部(首先执行),而不是底部(第二次执行) 尽管我理解这一点,但在我的应用程序中这已经成为一个真正的难题,因为我有一个类的子类,其中基类函数绑定一些事件,然后子类在后面绑定它们的附加事件 我感觉事件被向后放入“事件堆栈”(绑定您希望最后发生的事件)。有没有办法将事件附加到“事件堆栈”而不是插入开始 如果我误解了event.Skip()命令或缺少某些内容,请告诉我!:)有没有更好的方法来完成我正在尝试的操作?我不想让事件串在一起(例如:have OnKeyText(),一旦完成,调用OnKeyText2()),因为在我的应用程序中,一个事件处理程序被所有子类共享,而另一个不是 如果答案是“只需要以相反的顺序完成”,那么我将不得不接受这一点,并对我的应用程序进行更改 如果答案是我应该使用控件和面板之间的事件传播来控制事件处理程序的顺序,那么我感觉我遇到了相同的问题,除非我将每个传播级别的事件处理程序数量保持为一个 提前谢谢!
本杰明我不知道为什么订单对你来说很重要,但我有一个类似的问题 我最初在几个
TextCtrl
上有一个事件处理程序,它实际上是对EVT\u TEXT\u ENTER
做出反应的。然后我想验证输入的字符串,因为我希望文本字段中有一个正整数。为此,我将TextCtrl
子类化,并在子类中钩住一个事件处理程序以进行字符串验证
当然,有一个问题:当子类事件处理程序的验证在超类事件处理程序的工作之前完成时,它只在TextCtrl
s的一半上运行良好
我没有研究处理程序是如何在内部管理/处理的,而是修复了设计:子类事件处理程序绑定到EVT\u TEXT\u ENTER
,在验证字符串后,它会触发我引入的自定义事件。超类事件处理程序现在连接到此自定义事件,而不是EVT\u TEXT\u ENTER
这样,我总是能够确定处理顺序,并且对解绑/重新绑缚不敏感。如果字符串验证是定制事件的先决条件,我可以在定制事件上挂接更多的处理程序
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()