Seite 1 von 1
Welcher Button würde gedrückt?
Verfasst: Mittwoch 20. April 2005, 14:58
von Gast5555
Ich habe eine Anzahl von X Button. Der Text dieser Button ist von 1-x durchnummerriert. Wenn jetzt der User auf einen Button klickt, soll die Nummer des geklickten Buttons ausgegeben werden.
Wie mache ich das?
Verfasst: Mittwoch 20. April 2005, 15:29
von mawe
Hi!
Zum Beispiel so:
Code: Alles auswählen
from Tkinter import *
def click(text):
print "Button Nr. %s wurde gedrueckt" % text
root = Tk()
for i in range(10):
Button(text=i,command=lambda text=i: click(text)).pack()
root.mainloop()
Gruß, mawe
Verfasst: Mittwoch 20. April 2005, 16:06
von Gast5555
mawe hat geschrieben:Hi!
Zum Beispiel so:
Code: Alles auswählen
from Tkinter import *
def click(text):
print "Button Nr. %s wurde gedrueckt" % text
root = Tk()
for i in range(10):
Button(text=i,command=lambda text=i: click(text)).pack()
root.mainloop()
Gruß, mawe
Vielen Dank, es funktioniert. Doch ich kann es noch nicht ganz nachvollziehen. Besonders diesen Teil:
... command=lambda text=i: click(text) ...
Was bedeutet denn genau lambda?
Verfasst: Mittwoch 20. April 2005, 16:26
von Leonidas
Gast5555 hat geschrieben:Was bedeutet denn genau lambda?
lambda ist ein Schlüsselwort zum definieren von anonymen Funktionen. Damit kannst du Funktionen erstellen, die keinen Namen brauchen.
Dafür hast du hier eine anonyme Funktion
mit Namen.
Jetzt kannst du
x() ganz normal aufrufen, zb
x(1). Ein anonyme Funktion gibt immer den letzten Wert zurück und kann sowas wie
print oder ähnliches nicht aufrufen. Das ganze Lambda Kalkül ist eigentlich ein konzept aus der funktionalen Programmierung (wobei in Haskell, Lisp und Scheme Lambdas nützlicher sind).
Verfasst: Mittwoch 20. April 2005, 16:41
von mawe
Hi!
Naja, Leonidas war wieder mal schneller
Es wird ja gerade heftigst diskutiert, lambda, map und Konsorten aus Python zu verbannen. Da frag ich mich, wie würde man das Beispiel von Gast5555 ohne lambda machen?
Gruß, mawe
Verfasst: Mittwoch 20. April 2005, 16:49
von Gast5555
Genau, kann man das auch ohne dieses mir unbekannte lambda machen? Und wenn ja, wie?
Vielen Dank!
Verfasst: Mittwoch 20. April 2005, 16:51
von Leonidas
mawe hat geschrieben:Es wird ja gerade heftigst diskutiert, lambda, map und Konsorten aus Python zu verbannen.
Die meisten einsetzziele von map, filter und co. wurden ja durch *args, **kwargs, LCs und Generator Expressions ersetzt.
mawe hat geschrieben:Da frag ich mich, wie würde man das Beispiel von Gast5555 ohne lambda machen?
Vermutlich geht das schon irgendwie... aber ich muss zugeben: auf die schnelle ist mir nix eingefallen

Verfasst: Mittwoch 20. April 2005, 19:17
von mawe
Hi!
Hier mal was Guido v. R. dazu meint:
GvR hat geschrieben:
Why drop lambda?
...
Tkinter callbacks come to mind, but I find that more often than not the callbacks should be methods of some state-carrying object anyway (the exception being toy programs).
Kann mir bitte jemand an einem Beispiel zeigen, was genau genau ein state-carrying object ist.
Gruß, mawe
Verfasst: Mittwoch 20. April 2005, 22:32
von BlackJack
Jedes Objekt mit Instanzvariablen ist "state-carrying". Also Objekte, die sich über Aufrufe hinweg einen Zustand merken, was bei Funktionen ja allgemein nicht der Fall ist und bei anonymen Funktionen schon gar nicht.
Mawes Beispiel ohne ``lambda`` würde man wohl am einfachsten mit einem Closure lösen:
Code: Alles auswählen
from Tkinter import *
def make_click(text):
def click():
print "Button Nr. %s wurde gedrueckt" % text
return click
root = Tk()
for i in range(10):
Button(text=i,command=make_click(i)).pack()
root.mainloop()
Ist wahrscheinlich für die meisten Anfänger auch nicht verständlicher als die ``lambda``-Variante.

Verfasst: Donnerstag 21. April 2005, 06:28
von mawe
Hi Blackjack!
GvR hat geschrieben:
also, there is a widespread misunderstanding that lambda can do things that a nested function can't -- I still recall Laura Creighton's Aha!-erlebnis after I showed her there was no difference!
Mir gehts grad genauso. Cool! Good bye, lambda
PS:
Aha!-erlebnis? Is das Englisch?
Gruß, mawe