Hi there,
I have an event that is scattered throughout my program. Whenever we make a change that is committed to the database, we fire off a ModelChanged event that includes various information, which is then picked up by a variety of GUI elements to update the screen. However, I’m doing a bit of refactoring on how this is working. Instead of the GUI elements capturing the event as soon as it’s fired, I wish to pause it until another event happens. So, instead of doing this:
Fire Event -> Bindings receive event
I want it to do this:
Fire Event -> Wait for another separate event to fire -> Bindings receive original event.
Here is some code:
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()
Currently, when you click Fire Event, you'll get text printed to the console. I want to be able to click the "Fire Event" button, but wait until I click the "Release Event" button before my frame gets the original event and prints to console.
I don't know enough about how to write my own event classes - maybe there's some things I can override to tell it when to emit the event or not, and a cursory look didn't get anywhere. Thought I'd ask you guys if it's possible and, if so, how? :)
Thanks!
PS: Preferably this would work in 2.8 and 3.0.