Ein kleines komplettes Code Beispiel habe ich nicht, aber ich kann Dir erklären worum es geht.
Ich habe eine komplexe GUI die aus mehreren Komponenten besteht. Und die einzelnen Komponenten kennen einander nicht - könnten auch räumlich getrennt auf verschiedenen Rechnern laufen, was sie aber bei meinem GUI Designer nicht tun. Und die Komponenten brauchen voneinander gewisse Informationen.
Wenn der User ein Widget erzeugt hat und das mittels Maus über die Applikation bewegt, dann sollen ein bis zwei Komponenten des GUI Designers dessen Koordinaten anzeigen, während das Widget bewegt wird. Beim Widget war ich so frei, dieses mit mit <Button-1>, <ButtonRelease-1> und <B1-Motion> (dafür nehme ich inzwischen einen timer mit after) Events zu versehen, sodass es bewegt werden kann und dabei auch seine Position meldet.
Wie geht das nun, wenn das Widget keinerlei Ahnung von GuiDesigner Komponenten hat? Und die Komponenten auch nichts darüber wissen, ob der User das Widget bewegt?
Das geht ganz einfach, das Widget braucht nur eine Positionsmeldung durchgeben, während es bewegt wird und zwar eine Positionsmeldung für ihm unbekannte Empfänger.
Dafür nimmt man einen Event Broker. Dieser arbeitet nach dem publisher subscriber Prinzip.
Subscriber registrieren sich für den Empfang von bestimmen Messages oder Events. Und wenn ein Publisher solche Messages sendet, empfangen sie diese.
Der Code zum Ausgeben der Widget Koordinaten in Spinboxen meines Place Layouts sieht so aus:
Code: Alles auswählen
def set_yx_entries(SpinboxX = widget("X"), SpinboxY = widget("Y")):
if this().Layout==PLACELAYOUT:
SpinboxX.delete(0,END)
SpinboxX.insert(0,this().getlayout("x"))
SpinboxY.delete(0,END)
SpinboxY.insert(0,this().getlayout("y"))
# set X,Y spinboxes to X,Y layout values of the widget
do_receive('POSITION_CHANGED',set_yx_entries)
Hier registriert sich das Place Layout Modul als Empfänger für die Message mit der ID 'POSITION_CHANGED'. Da bei meinem System immer ein Widget das ausgewählte Widget ist, erübrigt sich die Übermittlung, um welches Widget es sich handelt, oder welche Koordinaten das Widget hat. Die Funktion kann für das selektierte Widget this() mittels getlayout('x') und getlayout('y') seber nachsehen. Aber genausogut hätte man die Koordinaten auch als Message Parameter mit übermitteln können.
Und was macht das Widget, während es bewegt wird? Es sendet einfach nur:
Durch Komma getrennt hätte man auch Message Parameter (bei mehreren als Tuple oder List) mitsenden können.
Es ist also so etwas wie ein Event. Aber ausgelöst wird dieser, indem irgend ewas aufruft: send(message_id,message_parameters)