How can I call a specific event manually from my own code?
-
You mean you want to have an event dispatch?
::wxPostEvent void wxPostEvent(wxEvtHandler *dest, wxEvent& event)
In a GUI application, this function posts event to the specified dest object using wxEvtHandler::AddPendingEvent. Otherwise, it dispatches event immediately using wxEvtHandler::ProcessEvent. See the respective documentation for details (and caveats).
Include files
<wx/app.h>cool-RR : I don't know C, this is confusing. Can you give me the Python line I'm supposed to run?apphacker : I think it's the same. wx.core.PostEvent? Check: http://www.google.com/codesearch?q=wxPostEvent&hl=en&btnG=Search+Codecool-RR : I don't see it in the main wx namespace, nor in Event's namespace.FogleBird : wx.PostEvent is the function and it works the same way. wx.PostEvent(window, event) -
I think you want wx.PostEvent.
There's also some info about posting events from other thread for long running tasks on the wxPython wiki.
-
Old topic, but I think I've got this figured out after being confused about it for a long time, so if anyone else comes through here looking for the answer, this might help.
To manually post an event, you can use
self.GetEventHandler().ProcessEvent(event)(wxWidgets docs here, wxPython docs here)
or
wx.PostEvent(self.GetEventHandler(), event)(wxWidgets docs, wxPython docs)
where
eventis the event you want to post. Construct the event with e.g.wx.PyCommandEvent(wx.EVT_BUTTON.typeId, self.GetId())if you want to post a EVT_BUTTON event. Making it a PyCommandEvent means that it will propagate upwards; other event types don't propagate by default.
You can also create custom events that can carry whatever data you want them to. Here's an example:
myEVT_CUSTOM = wx.NewEventType() EVT_CUSTOM = wx.PyEventBinder(myEVT_CUSTOM, 1) class MyEvent(wx.PyCommandEvent): def __init__(self, evtType, id): wx.PyCommandEvent.__init__(self, evtType, id) myVal = None def SetMyVal(self, val): self.myVal = val def GetMyVal(self): return self.myVal(I think I found this code in a mailing list archive somewhere, but I can't seem to find it again. If this is your example, thanks! Please add a comment and take credit for it!)
So now, to Post a custom event:
event = MyEvent(myEVT_CUSTOM, self.GetId()) event.SetMyVal('here is some custom data') self.GetEventHandler().ProcessEvent(event)and you can bind it just like any other event
self.Bind(EVT_CUSTOM, self.on_event)and get the custom data in the event handler
def on_event(self, e): data = e.GetMyVal() print 'custom data is: {0}'.format(data)Or include the custom data in the event constructor and save a step:
class MyEvent(wx.PyCommandEvent): def __init__(self, evtType, id, val = None): wx.PyCommandEvent.__init__(self, evtType, id) self.myVal = valetc.
Hope this is helpful to someone.
0 comments:
Post a Comment