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 btnDrücken eine eigene Funktion aufgerufen wird, die der button_press_handleim 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 commandOption als Verweis auf die Methode festgelegt werden sollte, die aufgerufen werden soll, ähnlich wie callbackin button_press_handle.
Aufrufen einer Methode ( Rückruf ) Wenn die Taste gedrückt wird
Ohne Argumente
Wenn ich also printetwas 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 printVerfahren , 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, printsodass 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 printintegrierte 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 lambdaAnweisung 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 lambdaAnweisung, 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 callbackdies nicht wirklich möglich ist, returnda es nur button_press_handlemit callback()im Gegensatz zu aufgerufen wird return callback(). Es tut returnaber 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 btnden 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