[Python-de] Tkinter und bind

Georg Mischler schorsch at schorsch.com
Sat May 4 13:22:58 EDT 2002


Albert Hermeling wrote:

> def prn(s):
>     print "Ich bin der Button", s
>
> names=["A","B","C","D","Ende","F","G","H","I"]
>
> class Gridder:
>     def __init__(self,w):
>         n = 0
>         for i in range(3):
>             for j in range(3):
>                 item=Button(w,text=names[n])
>                 if names[n] == "Ende":
>                     item["command"] = root.destroy
>                     item.bind("<Button-3>", lambda x=names[n] : prn(x) )
>                 else:
>                     item["command"] = lambda x=names[n] : prn(x)
>                 item.grid(row=i,column=j,sticky=E+W+N+S)
>                 n = n+1
>
> root=Tk()
> grc = Gridder(root)
>
> root.mainloop()
>
> Dieses Skript erzeugt neun Buttons. Acht Buttons rufen die Funktion "prn" auf
> wenn man sie mit der Linken Maustaste an klickt. Der Button Ende, beendet das
> Skript. Das Funktioniert bis hier her auch Perfekt.
>
> Jetzt möchte ich aber das der Ende Button seinen Namen ausgibt wenn man mit
> der rechten Maustaste den Button anklickt. Zu diesem Zweck habe ich den
> entsprechenden Button an die Methode bind gebunden. Klicke ich jetzt mit der
> rechten Maustaste den Button an bekomme ich folgende Meldung zurück
> geliefert:
>
> Ich bin der Button <Tkinter.Event instance at 0x822c4e4>
>
> stehen sollte da eigentlich "Ende"
>
> Weiß einer woran das liegt??


Die Library-Reference sagt in Kapitel 16.1.6.6 folgendes (beachte
die Zeile mit dem vorangestellten Ausrufezeichen):

  def bind(self, sequence, func, add=''):

  where:

  sequence
    is a string that denotes the target kind of event. (See the
    bind man page and page 201 of John Ousterhout's book for
    details).

  func
    is a Python function, taking one argument, to be invoked when
    the event occurs.
!!  An Event instance will be passed as the argument.
    (Functions deployed this way are commonly known as callbacks.)

  add
    is optional, either "" or "+". Passing an empty string
    denotes that this binding is to replace any other bindings
    that this event is associated with. Preceeding with a "+"
    means that this function is to be added to the list of
    functions bound to this event type.


Damit sollte dein Lambda folgendermassen aussehen:

  item["command"] = lambda event,x=names[n] : prn(x)

In deinem Original stellt names[n] den Vorgabewert fuer das
Argument x zu prn() dar, welcher vom tatsaechlichen Aufruf
ueberschrieben wird. Der "event"-Parameter faengt dieses
uebergebene Argument ab, und wirft es weg. Da Tkinter der
Callback-Funktion nur ein Argument uebergibt, bleibt der
Vorgabewert fuer x nun unberuehrt, so dass dein prn()
tatsaechlich das gewuenschte "Ende" zu sehen kriegt.


Viel Spass!

-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