2010-04-04 19 views
0

當事件循環中有兩個相同的事件時,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,但它確實。他們是否被分組?

回答

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 
+0

等等,我是否需要實際創建這個**需要X重新計算**標誌還是爲我創建? – 2010-04-04 15:42:11

+0

看我上面的編輯。 – 2010-04-04 20:53:54

0

如果你將發佈一個活動1000次,您將收到1000倍,爲什麼任何事件系統將它們分組,這將是一個錯誤。

如果你不想處理所有1000個忽略它們,也只有你可以決定他們應該如何分組,如果用戶快速改變某些東西,你想分組這些改變或響應所有事件,並有一個更好地響應用戶界

在你的情況下可能是你應該或者

  1. 組將它們與時間例如處理相隔N毫秒的事件
  2. 將值分組,例如,如果上一個值與當前值相同,則不執行任何操作
  3. 設置一個標誌是一個對象已被修改,您將得到事件,您執行某些操作並重置標誌,因此下次事件檢查標誌是否真的發生了變化

但是底線是你必須決定你如何迴應事件。

相關問題