+import wx
+
+#---------------------------------------------------------------------------
+
+def NewEvent():
+ """Generate new (Event, Binder) tuple
+ e.g. MooEvent, EVT_MOO = NewEvent()
+ """
+ evttype = wx.NewEventType()
+
+ class _Event(wx.PyEvent):
+ def __init__(self, **kw):
+ wx.PyEvent.__init__(self)
+ self.SetEventType(evttype)
+ self.__dict__.update(kw)
+
+ return _Event, wx.PyEventBinder(evttype)
+
+
+
+def NewCommandEvent():
+ """Generate new (CmdEvent, Binder) tuple
+ e.g. MooCmdEvent, EVT_MOO = NewCommandEvent()
+ """
+ evttype = wx.NewEventType()
+
+ class _Event(wx.PyCommandEvent):
+ def __init__(self, id, **kw):
+ wx.PyCommandEvent.__init__(self, evttype, id)
+ self.__dict__.update(kw)
+
+ return _Event, wx.PyEventBinder(evttype, 1)
+
+
+#---------------------------------------------------------------------------
+
+def _test():
+ """A little smoke test"""
+ from threading import Thread
+ from time import sleep
+
+ MooEvent, EVT_MOO = NewEvent()
+ GooEvent, EVT_GOO = NewCommandEvent()
+
+ DELAY = 0.7
+
+ def evt_thr(win):
+ sleep(DELAY)
+ wx.PostEvent(win, MooEvent(moo=1))
+
+ def cmd_thr(win, id):
+ sleep(DELAY)
+ wx.PostEvent(win, GooEvent(id, goo=id))
+
+ ID_CMD1 = wx.NewId()
+ ID_CMD2 = wx.NewId()
+
+ class Frame(wx.Frame):
+ def __init__(self):
+ wx.Frame.__init__(self, None, -1, "MOO")
+ sizer = wx.BoxSizer(wx.VERTICAL)
+ EVT_MOO(self, self.on_moo)
+ b = wx.Button(self, -1, "Generate MOO")
+ sizer.Add(b, 1, wx.EXPAND)
+ wx.EVT_BUTTON(self, b.GetId(), self.on_evt_click)
+ b = wx.Button(self, ID_CMD1, "Generate GOO with %d" % ID_CMD1)
+ sizer.Add(b, 1, wx.EXPAND)
+ wx.EVT_BUTTON(self, ID_CMD1, self.on_cmd_click)
+ b = wx.Button(self, ID_CMD2, "Generate GOO with %d" % ID_CMD2)
+ sizer.Add(b, 1, wx.EXPAND)
+ wx.EVT_BUTTON(self, ID_CMD2, self.on_cmd_click)
+
+ EVT_GOO(self, ID_CMD1, self.on_cmd1)
+ EVT_GOO(self, ID_CMD2, self.on_cmd2)
+
+ self.SetSizer(sizer)
+ self.SetAutoLayout(True)
+ sizer.Fit(self)
+
+ def on_evt_click(self, e):
+ t = Thread(target=evt_thr, args=(self, ))
+ t.setDaemon(True)
+ t.start()
+
+ def on_cmd_click(self, e):
+ t = Thread(target=cmd_thr, args=(self, e.GetId()))
+ t.setDaemon(True)
+ t.start()
+
+ def show(self, msg, title):
+ dlg = wx.MessageDialog(self, msg, title, wx.OK)
+ dlg.ShowModal()
+ dlg.Destroy()
+
+ def on_moo(self, e):
+ self.show("MOO = %s" % e.moo, "Got Moo")
+
+ def on_cmd1(self, e):
+ self.show("goo = %s" % e.goo, "Got Goo (cmd1)")
+
+ def on_cmd2(self, e):
+ self.show("goo = %s" % e.goo, "Got Goo (cmd2)")
+
+
+ app = wx.PySimpleApp()
+ f = Frame()
+ f.Show(True)
+ app.MainLoop()
+
+if __name__ == "__main__":
+ _test()