TKinter: bei Button-Klick: Funktionsaufruf mit Parameter

Fragen zu Tkinter.
Antworten
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Samstag 13. Januar 2007, 22:20

Hallo zusammen,

hoffe mit meinem Betreff keinen verwirrt zu haben...
Also mein Problem ist folgendes: Ich habe ein Tkinter-Fenster mit einem Button. Das Fenster ist als Objekt implementiert. Wenn man auf den Button klickt, soll eine Funktion (oder mein Methode eines anderen Objekts) mit Parameter aufgerufen werden.

Soweit so gut. Wenn ich das Programm jedoch starte, wird automatisch die entsprechende Funktion sofort aufgerufen (ohne dass ich klicke). Ein Klick auf die Schaltfläche bleibt dann auch erfolglos, spricht die Funktion wird dann nicht mehr aufgerufen (also einmal und nie wieder ;-) ).

Lasse ich aber den Parameter weg, (also command=textmalen statt command=textmalen('hallo welt')) dann funktioniert der Button.

Hiernochmal der Code unter Python 2.4 und W2K:

Code: Alles auswählen

from Tkinter import *

def textmalen(text='test'):
    print text


class ClassTKWINDOW:
    def __init__(self,master):
        self.but=Button(master,text="test",command=textmalen('hallo welt'))
        self.but.pack()
        

root=Tk()
mainwindow=ClassTKWINDOW(root)
root.mainloop()
Das ist ein Fehler, den ich definitiv nicht nachvollziehen kann... :cry:
Bin für jede Hilfe dankbar!

Grüße tobi
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Samstag 13. Januar 2007, 22:45

Code: Alles auswählen

self.but=Button(master,text="test",command=lambda:textmalen('hallo welt'))
MfG
HWK
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Samstag 13. Januar 2007, 23:45

Nett das wusste ich noch gar nicht. Gibt es dafür auch eine Erklärung das man noch lambda zur Hilfe ziehen muss?
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Sonntag 14. Januar 2007, 00:36

Ich kann dir jetzt nur mal sagen, dass ich wo gelesen habe, das Tkinter generell bei dem Aufruf von Funktionen/Methoden gar keine () will. Demnach erklärt das vielleicht ein klein wenig, warum man keine Parameter nehmen kann.
Genaueres kann ich dir dazu aber auch nicht sagen, sorry.
Gruß!
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 14. Januar 2007, 02:48

Das Problem wurde schon wiederholt abgehandelt. Verwende doch mal die Forumsuche mit z.B. 'lambda'. Da wirst Du reichlich Informationen erhalten.
MfG
HWK
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Sonntag 14. Januar 2007, 20:26

hallo hwk,
danke für den Hinweis. Wenn man weiß, nach welchem Strichwort (also z.B. lambda) man suchen muss, geht's naürlich gleich viel leichter :wink:

Grüße tobi
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Sonntag 14. Januar 2007, 22:11

Habe mir ein paar Sachen angeschaut.
Man muss einfach wissen das Tkinter keine Argumente da haben möchte und man muss es halt anders lösen. Entweder über lambda oder echte def's.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Sonntag 14. Januar 2007, 22:42

Es liegt nicht an den Argumenten. Es muss das Objekt der Funktion 'textmalen' übergeben werden. 'textmalen()' ruft aber die Funktion auf, egal ob ein Argument vorhanden ist. 'lambda' entspricht im Prinzip einer einzeiligen Funktionsdefinition ohne Namen.
MfG
HWK
Antworten