Seite 1 von 1

Sicher einfache Frage (NOOB)

Verfasst: Dienstag 14. Oktober 2008, 20:09
von Tarlanc
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?

Verfasst: Dienstag 14. Oktober 2008, 20:17
von cofi
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'.

Verfasst: Dienstag 14. Oktober 2008, 20:19
von numerix
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".

Verfasst: Dienstag 14. Oktober 2008, 20:19
von numerix
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.

Verfasst: Dienstag 14. Oktober 2008, 20:28
von kaytec
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

Verfasst: Dienstag 14. Oktober 2008, 20:28
von kaytec
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

Verfasst: Dienstag 14. Oktober 2008, 20:28
von Tarlanc
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.

Verfasst: Dienstag 14. Oktober 2008, 20:43
von numerix
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.