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
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.
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)