Beispiel GUI:
Angenommen, ich habe die GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Was passiert, wenn eine Taste gedrückt wird?
Beachten Sie, dass beim btn
Drücken eine eigene Funktion aufgerufen wird, die der button_press_handle
im folgenden Beispiel sehr ähnlich ist :
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
mit:
button_press_handle(btn['command'])
Sie können sich einfach vorstellen, dass diese command
Option als Verweis auf die Methode festgelegt werden sollte, die aufgerufen werden soll, ähnlich wie callback
in button_press_handle
.
Aufrufen einer Methode ( Rückruf ) Wenn die Taste gedrückt wird
Ohne Argumente
Wenn ich also print
etwas wollte, wenn die Taste gedrückt wird, müsste ich Folgendes einstellen:
btn['command'] = print # default to print is new line
Achten Sie auf das Fehlen von ()
mit dem print
Verfahren , das im Sinne weggelassen wird , dass: „Das ist der Name der Methode, die ich Sie wollen , wenn sie gedrückt nennen , aber . Sie es nicht nur diesem Augenblick nennen“ Ich habe jedoch keine Argumente für das übergeben, print
sodass gedruckt wurde, was auch immer gedruckt wird, wenn es ohne Argumente aufgerufen wird.
Mit Argument (en)
Wenn ich nun auch Argumente an die Methode übergeben möchte, die beim Drücken der Schaltfläche aufgerufen werden soll, kann ich die anonymen Funktionen verwenden, die mit der Lambda- Anweisung erstellt werden können, in diesem Fall für die print
integrierte Methode wie die folgende ::
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Aufrufen mehrerer Methoden, wenn die Taste gedrückt wird
Ohne Argumente
Sie können dies auch mit der lambda
Anweisung erreichen, aber es wird als schlechte Praxis angesehen, und daher werde ich es hier nicht aufnehmen. Es empfiehlt sich, eine separate Methode zu definieren multiple_methods
, die die gewünschten Methoden aufruft und diese dann als Rückruf für den Tastendruck festlegt:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Mit Argument (en)
Um Argumente an Methoden zu übergeben, die andere Methoden aufrufen, verwenden Sie erneut die lambda
Anweisung, aber zuerst:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
und dann setzen:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Rückgabe von Objekten aus dem Rückruf
Beachten Sie auch, dass callback
dies nicht wirklich möglich ist, return
da es nur button_press_handle
mit callback()
im Gegensatz zu aufgerufen wird return callback()
. Es tut return
aber nicht überall außerhalb dieser Funktion. Daher sollten Sie lieber Objekte ändern , auf die im aktuellen Bereich zugegriffen werden kann.
Vollständiges Beispiel mit globalen Objektmodifikationen.
Das folgende Beispiel ruft eine Methode auf, die btn
den Text jedes Mal ändert , wenn die Taste gedrückt wird:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
Spiegel