Welcher Button würde gedrückt?

Fragen zu Tkinter.
Antworten
Gast5555

Mittwoch 20. April 2005, 14:58

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?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 20. April 2005, 15:29

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
Gast5555

Mittwoch 20. April 2005, 16:06

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?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 20. April 2005, 16:26

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.

Code: Alles auswählen

x = lambda x: x + x
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).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 20. April 2005, 16:41

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
Gast5555

Mittwoch 20. April 2005, 16:49

Genau, kann man das auch ohne dieses mir unbekannte lambda machen? Und wenn ja, wie?
Vielen Dank!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 20. April 2005, 16:51

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 :?:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Mittwoch 20. April 2005, 19:17

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
BlackJack

Mittwoch 20. April 2005, 22:32

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. :wink:
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 21. April 2005, 06:28

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 :D

PS: Aha!-erlebnis? Is das Englisch? :wink:

Gruß, mawe
Antworten