wxWidgets / wxPython:两个相同的事件导致两个处理?

时间:2010-04-04 15:03:41

标签: python events wxpython wxwidgets

当事件循环中有两个相同的事件时,wxPython会处理它们,还是只为它们调用一次处理程序?

我的意思是,在我的小部件中,我希望有一个类似EVT_NEED_TO_RECALCULATE_X的事件。我希望在需要x重新计算的各种不同情况下发布此事件。但是,即使重新计算x有两个不同的原因,也只需要重新计算一次。

我该怎么做?

修改

我试过这段代码:

import wx

class Frame(wx.Frame):
    def __init__(self, parent=None):
        wx.Frame.__init__(self, parent)

        self.Bind(wx.EVT_COLOURPICKER_CHANGED, self.on_event)

        self.Centre()
        self.Show(True)

        self.i = 0

        self.event_all()

    def on_event(self, event):
        print self.i
        self.i += 1

    def event_all(self):
        for j in range(1000):
            event = wx.PyEvent()
            event.SetEventType(wx.EVT_COLOURPICKER_CHANGED.evtType[0])
            wx.PostEvent(self, event)


app = wx.App()
Frame(None)
app.MainLoop()

如果事件聚集在一起,我希望它不会一直计到1000.但确实如此。他们是否被分组?

2 个答案:

答案 0 :(得分:0)

你在谈论三件事

  • 事件
  • 事件的来源
  • 事件处理

事件是单一事件(X需要重新计算)。它有多个来源。但它只有一个处理程序。

所以它应该工作。你把它作为一个单独的事件,为它添加一个处理程序,但是随时发出信号/引发事件 - 每当你提出需要X重新计算标志时,处理程序应运行一次。


修改

这一行...

event = wx.PyEvent()

...创建事件。这意味着发生了一些事情,必须作出反应。 如果您创建了1000个事件,那么事件处理程序将被调用1000次。

每次事件发生时都会调用一次处理程序,也就是说,在事件队列中发布的每个PyEvent实例都会调用一次。

如果您想分组,一种方法是不创建新的PyEvent实例,如果有一个待处理的话:

class Frame(wx.Frame):
    def __init__(self, parent=None):
        wx.Frame.__init__(self, parent)
        self.Bind(wx.EVT_COLOURPICKER_CHANGED, self.on_event)
        self.Centre()
        self.Show(True)
        self.i = 0
        self.recalculating = False
        self.event_all()

    def on_event(self, event):
        self.recalculating = False
        print self.i
        self.i += 1

    def event_all(self):
        for j in range(1000):
            if not self.recalculating:
                event = wx.PyEvent()
                event.SetEventType(wx.EVT_COLOURPICKER_CHANGED.evtType[0])
                wx.PostEvent(self, event)
                self.recalculating = True

答案 1 :(得分:0)

如果您将发布1000次活动,您将收到1000次,为什么任何活动系统会将它们分组,这将是一个错误。

如果你不想处理它们中的所有1000个忽略它们,也只有你可以决定它们应该如何分组,如果用户快速改变了什么你想要对这些变化进行分组或响应所有事件并且有更好的响应式用户界面?

在你的情况下可能是你应该

  1. 按时间对它们进行分组,例如处理N毫秒分开的事件
  2. 将值分组,例如如果最后一个值与当前值相同则不执行任何操作
  3. 设置一个标志是一个被修改过的对象,你得到事件,你做了什么并重置了标志,所以下次关于事件检查标志是真的有没有改变的东西
  4. 但最重要的是你必须决定如何回应事件。