2009-03-12 7 views
5

Ma fenêtre de niveau supérieur doit savoir quand l'état interne d'un contrôle personnalisé change afin qu'il puisse mettre à jour diverses autres parties de l'interface graphique. Comment générer un événement personnalisé dans le contrôle, afin qu'il puisse se propager et être géré par la fenêtre de niveau supérieur?Générer un CommandEvent personnalisé dans wxPython

Répondre

12

Je sais que c'est un vieux question, mais il y a une façon plus récente et légèrement plus agréable de le faire dans wxPython. Paraphrasés de http://wiki.wxpython.org/CustomEventClasses et ci-dessus:

Pour définir l'événement:

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

Pour générer un événement:

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

Binding l'événement reste le même.

11

Pour se propager, l'événement doit être wx.CommandEvent. Plus précisément, il doit s'agir d'un wx.PyCommandEvent, qui est compatible Python et qui est capable de transporter ses bits Python en toute sécurité via le système d'événements wxWidgets et de les avoir toujours là lorsque le gestionnaire d'événements est appelé. .

Définir votre type d'événement personnalisé comme suit:

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

Vous voulez probablement faire au niveau du module, même si elle peut dans certains cas être souhaitable de le faire dans la méthode __init__ de votre commande.

Le contrôle peut maintenant générer un événement comme suit:

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

La fenêtre de niveau supérieur peuvent se lier et gérer l'événement de la manière habituelle:

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