代码之家  ›  专栏  ›  技术社区  ›  Ram Rachum

wxwidgets/wxpython:两个相同的事件会导致两次处理吗?

  •  0
  • Ram Rachum  · 技术社区  · 14 年前

    当事件循环中有两个相同的事件时,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 回复  |  直到 14 年前
        1
  •  0
  •   nosklo    14 年前

    你说的是三件事

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

    事件是单个事件(需要重新计算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
    
        2
  •  0
  •   Anurag Uniyal    14 年前

    如果你将发布一个事件1000次,你将收到它1000次,为什么任何事件系统会将它们分组,这将是一个bug。

    如果您不想处理全部1000个,忽略它们,也只有您可以决定如何对它们进行分组,如果用户快速更改某些内容,您想对这些更改进行分组或响应所有事件并拥有更好的响应用户界面吗?

    在你的情况下,你应该

    1. 对它们进行时间分组,例如处理相隔N毫秒的事件
    2. 用值分组,例如,如果最后一个值与当前值相同,则不执行任何操作。
    3. 设置一个标志是一个对象已经被修改,你得到了事件,你做了一些事情,并重置了标志,所以下次在事件检查标志上的东西确实已经改变了或没有。

    但底线是你必须决定如何应对事件。