2009-03-12 2 views
5

La finestra di primo livello deve sapere quando lo stato interno di un controllo personalizzato cambia in modo che possa aggiornare varie altre parti della GUI. Come faccio a generare un evento personalizzato nel controllo, in modo che possa propagarsi e essere gestito dalla finestra di livello superiore?Generazione di un comando CommandEvent in wxPython

risposta

12

So che questo è un vecchio domanda, ma c'è un modo nuovo, leggermente più bello, per farlo in wxPython. Parafrasato da http://wiki.wxpython.org/CustomEventClasses e sopra:

Per definire l'evento:

import wx.lib.newevent 
QuantityChangedEvent, EVT_QUANTITY_CHANGED = wx.lib.newevent.NewCommandEvent() 

Per generare un evento:

event = QuantityChangedEvent(self.GetId()) 
self.GetEventHandler().ProcessEvent(event) 
# or ... 
#wx.PostEvent(self, event) 

Binding caso rimane la stessa.

11

Per propagarsi, l'evento deve essere un wx.CommandEvent. (Vedi lo wxWidgets event handling overview per dettagli sulla propagazione.) Più specificamente, dovrebbe essere un wx.PyCommandEvent, che è in grado di riconoscere Python in modo sicuro attraverso il sistema di eventi wxWidgets e averli ancora lì quando il gestore di eventi viene richiamato .

Definire il tipo di evento personalizzato come segue:

EVT_QUANTITY_CHANGED = wx.PyEventBinder(wx.NewEventType(), 1) 

probabilmente si vuole fare questo a livello di modulo, anche se può in alcune circostanze essere desiderabile per fare questo nel metodo del controllo __init__.

Il controllo può ora generare un evento come segue:

event = wx.PyCommandEvent(EVT_QUANTITY_CHANGED.typeId, self.GetId()) 
self.GetEventHandler().ProcessEvent(event) 

La finestra di primo livello in grado di legare e gestire l'evento nel solito modo:

self.Bind(mycontrol.EVT_QUANTITY_CHANGED, self.OnQuantityChanged)