2009-03-12 8 views
5

Mein Fenster der obersten Ebene muss wissen, wenn der interne Status eines benutzerdefinierten Steuerelements geändert wird, damit es verschiedene andere Teile der GUI aktualisieren kann. Wie erzeuge ich ein benutzerdefiniertes Ereignis im Steuerelement, sodass es vom Fenster der obersten Ebene weitergegeben und verarbeitet werden kann?Generieren eines benutzerdefinierten CommandEvent in WxPython

Antwort

12

Ich weiß, das ist ein alter Frage, aber es gibt einen neueren, etwas netteren Weg, dies in wxPython zu tun. Umschrieben von http://wiki.wxpython.org/CustomEventClasses und der oben:

das Ereignis zu definieren:

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

ein Ereignis zu generieren:

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

Bindung des Ereignisses gleich bleibt.

11

Um sich auszubreiten, muss das Ereignis ein wx.CommandEvent sein. (Details zur Propagierung finden Sie unter wxWidgets event handling overview.) Genauer gesagt sollte es eine wx.PyCommandEvent sein, die Python-fähig ist und ihre Python-Bits sicher durch das wxWidgets-Ereignissystem transportieren kann und sie immer noch dort haben, wenn der Event-Handler aufgerufen wird .

Ihren benutzerdefinierten Ereignistyp wie folgt definieren:

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

Sie wahrscheinlich dieses auf Modulebene tun wollen, obwohl es in einigen Fällen wünschenswert sein kann, das in der __init__ Methode der Kontrolle zu tun.

kann die Steuerung nun ein Ereignis erzeugen, wie folgt:

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

Die Top-Level binden kann und das Ereignis in der üblichen Art und Weise handhaben:

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