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