[Python-de] Tkinter und bind

Georg Mischler schorsch at schorsch.com
Sat May 4 17:37:37 EDT 2002


> Georg Mischler schrieb:
> > Albert Hermeling wrote:
>
> > In deinem Original stellt names[n] den Vorgabewert fuer das
> > Argument x zu prn() dar, welcher vom tatsaechlichen Aufruf
> > ueberschrieben wird.....
>
> Da muss ich Passen das verstehe ich leider nicht :-(((
>
> Wie es funktioniert verstehe ich nicht, schaue ich mir diese Programmzeile an:
>
> item.bind("<Button-3>",lambda event,x=names[n] : prn(x) )
>
> stellt sich mir gleich eine Frage.
>
> Was ist event, eine Methode bzw. Funktion in Tk? Denn Tkinter kennt nur die
> Klasse Event und die hat keine Methode event, das habe ich schon überprüft.


"event" ist der Variablenname des ersten Parameters der
erzeugten Lambda-Funktion. "Event" ist der Klassenname der
Tkinter Event-Objekt-Instanz, welche diesem Parameter bei
einem rechten Mausklick dann uebergeben wird. Die beiden
Namen sind ansonsten aber voellig unabhaengig voneinander.

Zum besseren Verstaendnis, die beiden folgenden Definitionen
sind exakt Aequivalent:

 def callback(event, x='blah'):
   prn(x)

 callback = lambda event,x='blah': prn(x)

Der einzige Unterschied besteht in der Belegung des __name__
Attributs der jeweiligen Funktion, welches im ersten Fall
"callback" lautet, und im zweiten Fall "<lambda>". Das ist
aber nur fuer die Fehlermeldungen in einem eventuellen
Traceback relevant, und kann mit callback.__name__="callback"
leicht geaendert werden.


Ach ja, und ich habe natuerlich in meiner ersten Antwort die
Zeilen der Originalfunktion durcheinandergebracht.
Die korrekte Loesung heisst tatsaechlich:

  item.bind("<Button-3>", lambda event,x=names[n]: prn(x))

Das Lambda dem item["command"] zuzuweisen hat wirklich nicht
den gewuenschten Effekt. Sorry fuer die Konfusion... ;)


-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch.com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/




More information about the Python-de mailing list