2009-03-12 20 views
5

Moje okno najwyższego poziomu musi wiedzieć, kiedy zmienia się stan wewnętrzny niestandardowego formantu, aby można było aktualizować różne inne elementy interfejsu GUI. Jak wygenerować niestandardowe zdarzenie w formancie, aby można było propagować i być obsługiwane przez okno najwyższego poziomu?Generowanie niestandardowego obiektu CommandEvent w wxPython

Odpowiedz

12

wiem, że to jest stary pytanie, ale istnieje nowszy, nieco ładniejszy sposób na zrobienie tego w wxPythonie. Parafrazowane z http://wiki.wxpython.org/CustomEventClasses i wyżej:

zdefiniowanie terminu:

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

generuje zdarzenie:

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

Wiązanie zdarzenie pozostaje taka sama.

11

Aby propagować, wydarzenie musi być wx.CommandEvent. (Szczegółowe informacje na temat propagacji znajdują się w wxWidgets event handling overview.) Dokładniej, powinien to być wx.PyCommandEvent, który jest wyposażony w Python i jest w stanie bezpiecznie przenosić bity w języku Python za pośrednictwem systemu zdarzeń wxWidgets i nadal je tam przechowywać po wywołaniu procedury obsługi zdarzeń .

Określ swój własny typ zdarzenia w następujący sposób:

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

Prawdopodobnie chcesz zrobić to na poziomie modułu, chociaż może w pewnych okolicznościach być pożądane, aby to zrobić w metodzie kontrolą __init__.

Sterowanie może teraz generować zdarzenie następująco:

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

okno najwyższego poziomu może wiązać i obsłużyć zdarzenia w zwykły sposób:

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