Parameterübergabe in TKinter?

Fragen zu Tkinter.
Antworten
xturbo77
User
Beiträge: 39
Registriert: Montag 9. September 2002, 20:05
Kontaktdaten:

Donnerstag 11. September 2003, 09:29

Ich kenn mich mit GUI Programmierung (Java/Swing) zwar etwas aus, aber bei TKinter ist mir so einiges noch sehr schleierhaft :oops:

Kann mir bitte jemand mal erklären wie ich einer Funktion, die ich über einen Button aufrufen möchte Parameter übergeben kann?

Folgendes Beispiel:

Code: Alles auswählen

from Tkinter import *

def say_hi():
    name = entry.get()
    print "Hi, ", name

root = Tk()
    
frame = Frame(root)
frame.pack()

entry = Entry(frame)
entry.pack()

button = Button(frame, text="QUIT", fg="red", command=frame.quit)
button.pack(side=LEFT)

hi_there = Button(frame, text="Hello", command=say_hi)
hi_there.pack(side=LEFT)

root.mainloop()
Der Button soll die Funktion say_hi aufrufen mit einem Paramter name. Normalerweise würde ich etwas wie folgendes erwarten:

Code: Alles auswählen

def say_hi(name):
    print "Hi, ", name

Code: Alles auswählen

hi_there = Button(frame, text="Hello", command=say_hi("Hugo"))
Wie kann ich unter TKinter so ein Konstrukt bewerkstelligen???

Das obige Beispiel funktioniert ja nur deshalb weil der Name entry (das Eingabefeld) global ist.
Folgendes z.b. würde ja nichtmehr funktionieren:

Code: Alles auswählen

from Tkinter import *

def say_hi():
    name = entry.get()
    print "Hi, ", name

def body(master):
    
    frame = Frame(master)
    frame.pack()

    entry = Entry(frame)
    entry.pack()

    button = Button(frame, text="QUIT", fg="red", command=frame.quit)
    button.pack(side=LEFT)

    hi_there = Button(frame, text="Hello", command=say_hi)
    hi_there.pack(side=LEFT)

root = Tk()
body(root)
root.mainloop()
Jetzt ist entry nichtmehr global sondern nur innerhalb der body Funktion verfügbar. Es kann doch nicht sein dass ich in diesem Fall gezwungen bin entry global zu definieren, oder?!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Donnerstag 11. September 2003, 10:38

Hallo!
xturbo77 hat geschrieben:

Code: Alles auswählen

hi_there = Button(frame, text="Hello", command=say_hi("Hugo"))
Wie kann ich unter TKinter so ein Konstrukt bewerkstelligen???
Darüber stolpert irgendwann jeder Tkinter-Newbie. Warum obiges nicht geht, ist klar? say_hi() wird nur ein einziges mal ausgeführt und zwar wenn Button() ausgeführt wird. Und da say_hi() None zurückgibt, kann man auch gleich command=None schreiben ;-)

Das berühmt berüchtigte lambda ist die Lösung:

Code: Alles auswählen

def say_hi(name):
    print "Hi, ", name
...
    hi_there = Button(frame, text="Hello", command= lambda: say_hi(entry.get()))
Jan
xturbo77
User
Beiträge: 39
Registriert: Montag 9. September 2002, 20:05
Kontaktdaten:

Donnerstag 11. September 2003, 12:19

Thx!
Ich frage mich warum man diesen Hinweis in keinem Tkinter Tutorial findet?!?! :cry:
Gast

Donnerstag 11. September 2003, 14:18

das wollte ich auch schon lange mal wissen.....

nur: was ist lambda genau? kannst du das erklären? und warum es ohne net geht ist mir auch net wirklich klar, aber vielleicht sitze ich grad auf der...... :D

mfg

roland
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 11. September 2003, 15:19

Hi rolgal,

lambda ist eine namenlose Funktion und die kannst Du überall verwenden, wo du sonst eine Funktion einsetzen würdest.

Beispiel:

Code: Alles auswählen

>>> def f_add(a,b):
...     return a + b
... 
>>> l_add = lambda a, b: a+b
>>> f_add(5,7)
12
>>> l_add(5,7)
12
lambda kann andere Funktionen aufrufen und so wie in eurem Beispiel als Wrapper für eine Funktion dienen. Heufig wird lambda auch bei map() und reduce() verwendet, man spart sich da dann eine extra Funktion zu definieren.
Beispiel:

Code: Alles auswählen

>>> liste = range(1,10)
>>> reduce(lambda a, b: a * b - b, liste)
-260649
>>> def funktion(a, b): return a*b-b
... 
>>> reduce(funktion, liste)
-260649

Gruß

Dookie
Gast

Donnerstag 11. September 2003, 17:18

cooles teil diese lambda funktion,

danke dir wiedermal für deine anschauliche erläuterung,

mfg

roland
Gast

Donnerstag 11. September 2003, 17:19

cooles teil diese lambda funktion,

danke dir wiedermal für deine anschauliche erläuterung,

mfg

roland
lbuega
User
Beiträge: 75
Registriert: Dienstag 15. April 2003, 08:51
Wohnort: Weissach

Freitag 27. Februar 2004, 17:07

Hallo Leute,
hab diese Beiträge dank der "Suche"-Funktion gefunden. Hat mir viel gebracht. Vor allem das Beispiel von Voges mit dem Aufruf einer Funktion in einer Funktion in lambda: :o
Voges hat geschrieben: Das berühmt berüchtigte lambda ist die Lösung:

Code: Alles auswählen

def say_hi(name):
    print "Hi, ", name
...
    hi_there = Button(frame, text="Hello", command= lambda: say_hi(entry.get()))
Jan
Super Sache, vielen Dank! :D
Antworten