当事件循环中有两个相同的事件时,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.但确实如此。他们是否被分组?
答案 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个忽略它们,也只有你可以决定它们应该如何分组,如果用户快速改变了什么你想要对这些变化进行分组或响应所有事件并且有更好的响应式用户界面?
在你的情况下可能是你应该
但最重要的是你必须决定如何回应事件。