Button Command

Fragen zu Tkinter.
Antworten
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Code: Alles auswählen

from tkinter import *

master = Tk()

eingabe = Entry(master, textvariable = StringVar(value="Hello World"))
eingabe.pack(side = "bottom")

ok_button = Button(master, text="OK", command=print(eingabe.get()))
ok_button.pack()

master.mainloop()
Dieses Problem macht mich fertig. Ich suche seit gestern die Lösung, nachdem ich nach ewig langer Pause wieder den Einstieg in Python wagen musste/wollte.

Immer wenn ich das Modul starte, zeigt es mir sofort 'Hello World' in der Konsole an, obwohl es doch nur dann anzeigen sollte, wenn dieser Button auch gedrückt worden ist.

Der Fehler muss wohl so offentsichtlich sein, dennoch sehe ich ihn nicht.

Danke. Ein kurzer Tipp reicht aus.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei der Definition des Buttons führst Du die print-Funktion aus und bindest deren Rückgabewert (None) an den command-Parameter. Du möchtest wahrscheinlich eine Funktion definieren, die die print-Funktion ausführt und diese an command binden.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

OK, verstanden. Ich versuche es nun über Events.

Wenn ein Benutzer mit der linken Maustaste auf den besagten Button klickt, soll der Text erscheinen, welcher sich im Eingabenfeld befindet.

Code: Alles auswählen

from tkinter import *

def callback(passwort):
    print(passwort)
        
master = Tk()


eingabe = Entry(master, textvariable = StringVar(value="Hello World"))
eingabe.pack(side = "bottom")

ok_button = Button(master, text="OK")
ok_button.bind("<Button-1>", callback(eingabe.get()))
ok_button.pack()


master.mainloop()
Also:

Code: Alles auswählen

eingabe = Entry(master, textvariable = StringVar(value="Hello World"))
Wenn der Benutzer was anderes eingibt, ändert sich die Variable value?

Immer noch das gleiche Problem: Gleich beim Start des Programmes kommt: "Hello World" in der Konsole.

Dieses Problem zerfrisst mich und ich bin so bescheuert und sehe den Fehler nicht.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Auch bind erwartet wie das command-Argument eine Funktion und nicht den Rückgabewert einer Funktion, der None ist.
BlackJack

@Gary123456: `bind()` ist bei einer Schaltfläche ausserdem der falsche Weg weil sich das dann für den Benutzer ungewohnt verhält.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Habe nun das Problem gelöst.

Aber:
@Gary123456: `bind()` ist bei einer Schaltfläche ausserdem der falsche Weg weil sich das dann für den Benutzer ungewohnt verhält.
Was meinst Du damit genau?
BlackJack

@Gary123456: Dein `bind()` reagiert sofort mit der Aktion wenn man den Mausknopf auf der Schaltfläche drückt. Normale Schaltflächen reagieren 1. erst wenn man loslässt, und 2. auch nur wenn man *über der Schaltfläche* loslässt. Man kann also auch den Mausknopf über der Schaltfläche drücken, den Mauszeiger mit gedrückter Taste von der Schaltfläche herunterbewegen, und dann loslassen *ohne* das die Aktion ausgelöst wird. All das macht die Schaltfläche mit `command`. Wenn `command` und `bind` das selbe machen würden, bräuchte man `command` ja nicht, denn `bind` gibt es auf jedem Widget. Ausserdem kann man auch mit der Tabulatortaste den Fokus von Widgets ändern und wenn eine Schaltfläche den Fokus hat, diese mit der Leertaste auslösen. Das führt dann das `command` aus, aber nicht was mit `bind()` an die Maustaste gebunden ist.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Danke für die Erklärung.
Antworten