5

我是一个相对有经验的 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()),因为在我的应用程序中,一个事件处理程序由所有子类共享,而另一个不是。

如果答案是“只需要以相反的顺序完成”,那么我将不得不接受这一点并对我的应用程序进行更改。

如果答案是我应该使用控件和面板之间的事件传播来控制事件处理程序的顺序,我觉得我遇到了同样的问题,除非我将每个传播级别的事件处理程序的数量保持为一个。

提前致谢!本杰明

4

1 回答 1

0

我不确定我是否理解为什么订单在您的情况下很重要,但我遇到了类似的问题。

我最初在几个上都有一个事件处理程序TextCtrl,它实际上完成了对EVT_TEXT_ENTER. 然后我想验证输入的字符串,因为我期望文本字段中有一个正整数。我TextCtrl为此目的进行了子类化,并在子类中挂钩了一个事件处理程序以进行字符串验证。

当然,有一个问题:TextCtrl当子类事件处理程序的验证在超类事件处理程序的工作之前完成时,它只对一半的 s 工作得很好。

我没有调查处理程序是如何在内部管理/处理的,而是修复了设计:子类事件处理程序绑定到EVT_TEXT_ENTER,在验证字符串后,它会触发我引入的自定义事件。超类事件处理程序现在与此自定义事件挂钩,而不是EVT_TEXT_ENTER.

这样,我总是可以确定处理顺序,并且对解除绑定/重新绑定不敏感。如果字符串验证是它们的先决条件,我可以在自定义事件上挂钩更多处理程序。

于 2012-11-15T10:37:47.203 回答