Sicher einfache Frage (NOOB)

Fragen zu Tkinter.
Antworten
Tarlanc
User
Beiträge: 4
Registriert: Dienstag 14. Oktober 2008, 19:59

Guten Abend allerseits,

seit Stunden versuche ich nun, anhand mehrerer Tutorials ein einziges kleines Fensterchen mit Grid-Geometrie zu machen, in dem eine Schaltfläche sitzt, die auch etwas tut.

Aber egal was ich tue, es funktioniert einfach nicht.
Kann mir irgendjemand der hier anwesenden Experten bitte sagen, warum dies hier nicht ein Fenster mit einer Schaltfläche gibt, welche auf Knopfdruck 'hallo' ausgibt?

Code: Alles auswählen

import Tkinter

class fenster(Tkinter.Frame):
    def __init__(self, master=None):        
        Tkinter.Frame.__init__(self,master)
        self.grid()
        self.fuellen()

    def fuellen(self):
        self.knopf = Tkinter.Button(self, text='hallo', command=self.schreib('hallo'))
        self.knopf.grid()

    def schreib(self,wort):
        print wort

fens = fenster()
fens.mainloop()
Ich meine, es gibt nicht viele Orte, an denen ein Fehler stehen kann.
Aber dennoch führt das Programm bei der Initialisation den Button-Befehl (fenster.schreib) aus und weigert sich hatrnäckig, das auf Drücken des Knopfes zu wiederholen.

Was genau ist falsch? Oder kann mir jemand ein Programm in vergleichbarer Komplexität schreiben, das genau diesen Zweck erfüllt?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dein Programm dürfte sogar das tun was du willst. Allerdings schreibst du das Wort in StdOut, d.h. in deinem GUI siehst du das nicht.

Benutze ein Label und setze dessen Text bei dem Aufruf von "fenster.schreib' auf `wort'.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hallo Tarlanc, willkommen im Forum.

Dein Code sieht gar nicht so schlecht aus. Gut wäre es, wenn du den Namen für die Klasse mit einem Großbuchstaben beginnen würdest (gemäß Konvention).

Das Problem besteht darin, dass du als Eventhandler (das ist die Funktion, die ausgeführt werden soll, wenn der Button angeklickt wird) keine Funktion, sondern einen Funktionswert übergibst. Das funktioniert nicht.

Willst du unbedingt einen Parameter an den Eventhandler übergeben, dann wäre eine lambda-Konstruktion angeraten, aber vielleicht kannst du es erstmal ohne Parameter machen, also so:

Code: Alles auswählen

command = self.schreib
Und dann entsprechend die Funktion schreib ändern: Parameter "wort" weg und Ausgabe von "hallo".
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

cofi hat geschrieben:Dein Programm dürfte sogar das tun was du willst. Allerdings schreibst du das Wort in StdOut, d.h. in deinem GUI siehst du das nicht.

Benutze ein Label und setze dessen Text bei dem Aufruf von "fenster.schreib' auf `wort'.
Nein.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo Tartanc !

Es ist ja schon alles gesagt, doch du kannst auch etwas uebergeben.

Code: Alles auswählen

def fuellen(self):
        self.knopf = Tkinter.Button(self, text='hallo', lambda , 
text="Hallo": command=self.schreib(text))
        self.knopf.grid()
 
Das war ein Doppelpost - warum auch immer ?

gruss frank
Zuletzt geändert von kaytec am Dienstag 14. Oktober 2008, 20:30, insgesamt 1-mal geändert.
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

Hallo Tartanc !

Es ist ja schon alles gesagt, doch du kannst auch etwas uebergeben.

Code: Alles auswählen

def fuellen(self):
        self.knopf = Tkinter.Button(self, text='hallo', lambda
            text="Hallo": command=self.schreib(text))
        self.knopf.grid()
 
edit: 15.10.05 00:02 --> Komma entfernt --> danke Numerix
Zuletzt geändert von kaytec am Dienstag 14. Oktober 2008, 23:03, insgesamt 1-mal geändert.
Tarlanc
User
Beiträge: 4
Registriert: Dienstag 14. Oktober 2008, 19:59

numerix hat geschrieben:Willst du unbedingt einen Parameter an den Eventhandler übergeben, dann wäre eine lambda-Konstruktion angeraten, aber vielleicht kannst du es erstmal ohne Parameter machen
Ahaaa, so geht es tatsächlich.
Ich hab es zwar noch nicht ganz verstanden, aber auf der anderen Seite hab ich auch noch nicht ganz verstanden, wozu die Lambda-Notation gut ist. Da scheint es einen Zusammenhang zu geben :)

Vielen Dank für die Prompte Hilfe.

Kann man denn gar keine Argumente an einen Eventhandler geben? Das Programm, das ich eigentlich schreiben wollte, bis es ich obige Minimalausführung reduziert habe, sollte eigentlich die Werte von Textfeldern an Funktionen übergeben können.

EDIT: Danke, hat sich auch erledigt. Die Funktion kann ja über .get() den Wert der Felder selber auslesen und verarbeiten. Jetzt hab ich das Prinzip verstanden.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du kannst auch Parameter übergeben, wenn es nötig ist. Kaytec hat ja einen Weg aufgezeigt (aber was soll das Komma hinter dem lambda???).

Wenn du auch verstehen willst, was da passiert, empfehle ich einen Blick ins Tutorial oder sonstige Doku, um dich mit lambda-Ausdrücken vertraut zu machen. Mit Tkinter oder Events hat das nämlich zunächst gar nichts zu tun.
Antworten