2017-04-15 18 views
0

我有一個分散在我的程序中的事件。每當我們對數據庫進行更改時,我們都會觸發ModelChanged事件,其中包含任意信息,然後由各種GUI元素拾取以更新屏幕。但是,我正在做一些關於如何工作的重構。一旦它被觸發,GUI元素不會捕獲事件,我希望暫停它直到發生另一事件。所以,與其這樣:如何在將事件釋放給與之綁定的事件之前對其進行排隊

火災事件 - >綁定接收事件

我希望它這樣做:

火災事件 - >等待另一個單獨的事件,火災 - >綁定接收原始事件。

下面是一些代碼:

打印到控制檯
import wxversion 
wxversion.select(['3.0', '2.8']) 
import wx 
import wx.lib.newevent 

OriginalEvent, ORIGINAL_EVT = wx.lib.newevent.NewEvent() 
ReleaseEvent, RELEASE_EVT = wx.lib.newevent.NewEvent() 

class MyFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.fireOriginalBtn = wx.Button(self, wx.ID_ANY, "Fire Event") 
     self.fireOriginalBtn.Bind(wx.EVT_BUTTON, self.fireOriginal) 

     self.releaseEventBtn = wx.Button(self, wx.ID_ANY, "Release Event") 
     self.releaseEventBtn.Bind(wx.EVT_BUTTON, self.releaseEvent) 

     self.sizer.Add(self.fireOriginalBtn, 1, wx.EXPAND) 
     self.sizer.Add(self.releaseEventBtn, 1, wx.EXPAND) 

     self.SetSizer(self.sizer) 
     self.SetAutoLayout(1) 
     self.sizer.Fit(self) 

     self.Bind(ORIGINAL_EVT, self.captureOriginal) 
     self.Bind(RELEASE_EVT, self.captureRelease) 
     self.Show(True) 

    def fireOriginal(self, evt): 
     wx.PostEvent(self, OriginalEvent(myInfo=[1,2,3,4])) 

    def releaseEvent(self, evt): 
     wx.PostEvent(self, ReleaseEvent()) 

    def captureOriginal(self, evt): 
     print "Event captured" 

    def captureRelease(self, evt): 
     print "Release captured" 

app = wx.App(False) 
frame = MyFrame(None, 'Small editor') 
app.MainLoop() 

目前,當你點擊火災事件,你會得到的文本。我希望能夠點擊「火災事件」按鈕,但等到我的框架獲取原始事件並打印到控制檯之前單擊「發佈事件」按鈕。

我不太瞭解如何編寫自己的事件類 - 也許有些事情我可以重寫來告訴它什麼時候發出事件,而粗略的看不到任何地方。有什麼建議麼?

謝謝!

+0

這是你可以用'wx.EVT_IDLE'來代替嗎? – otterb

+0

不,不是真的 - https://wxpython.org/docs/api/wx.IdleEvent-class.html –

回答

0

wxPython像每個其他GUI工具包一樣是事件驅動的。沒有辦法使事件暫停並等待第二個事件。相反,您可以設置一個屬性,告訴您Fire Event按鈕何時被按下,並在第二個事件中使用該屬性來確定您應該執行的操作。這裏有一個例子:

import wxversion 
wxversion.select(['3.0', '2.8']) 
import wx 
import wx.lib.newevent 

OriginalEvent, ORIGINAL_EVT = wx.lib.newevent.NewEvent() 
ReleaseEvent, RELEASE_EVT = wx.lib.newevent.NewEvent() 

class MyFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(200,100)) 
     self.fire_event = False 

     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.fireOriginalBtn = wx.Button(self, wx.ID_ANY, "Fire Event") 
     self.fireOriginalBtn.Bind(wx.EVT_BUTTON, self.fireOriginal) 

     self.releaseEventBtn = wx.Button(self, wx.ID_ANY, "Release Event") 
     self.releaseEventBtn.Bind(wx.EVT_BUTTON, self.releaseEvent) 

     self.sizer.Add(self.fireOriginalBtn, 1, wx.EXPAND) 
     self.sizer.Add(self.releaseEventBtn, 1, wx.EXPAND) 

     self.SetSizer(self.sizer) 
     self.SetAutoLayout(1) 
     self.sizer.Fit(self) 

     self.Bind(ORIGINAL_EVT, self.captureOriginal) 
     self.Bind(RELEASE_EVT, self.captureRelease) 
     self.Show(True) 

    def fireOriginal(self, evt): 
     self.fire_event = True 

    def releaseEvent(self, evt): 
     wx.PostEvent(self, ReleaseEvent()) 
     if self.fire_event: 
      wx.PostEvent(self, OriginalEvent(myInfo=[1,2,3,4])) 
      self.fire_event = False 

    def captureOriginal(self, evt): 
     print "Event captured" 

    def captureRelease(self, evt): 
     print "Release captured" 

app = wx.App(False) 
frame = MyFrame(None, 'Small editor') 
app.MainLoop() 
相關問題