HOWTO · Tkinter
Wie man Argumente an den Tkinter-Button-Befehl übergibt
Wie man Argumente an den Tkinter-Knopfbefehl übergibt
Auf dieser Seite
Die Option command eines Tkinter-Buttons erwartet ein aufrufbares Objekt. Um Argumente zu übergeben, binden Sie sie vorab und lassen Tkinter das Objekt erst nach einem Klick aufrufen. command=show_message("Saved") ruft die Funktion bereits beim Erstellen des Buttons auf. Verwenden Sie partial oder einen lambda-Wrapper, um den Aufruf aufzuschieben.
Argumente mit functools.partial übergeben
Verwenden Sie functools.partial, wenn Sie Argumente an eine vorhandene Funktion binden möchten. Die Funktion gibt ein aufrufbares Objekt mit den gebundenen Werten zurück, das sich direkt der Option command eines Buttons zuweisen lässt. Diese Simulation ohne grafische Oberfläche bildet den command-Eintrag eines Buttons nach. So wird das Verhalten des Callbacks sichtbar, ohne ein Fenster zu öffnen. Führen Sie das folgende Beispiel aus:
from functools import partial
def show_message(message):
print(message)
class Button:
def __init__(self, command):
self.command = command
def click(self):
self.command()
save_button = Button(command=partial(show_message, "Saved"))
remove_button = Button(command=partial(show_message, "Removed"))
save_button.click()
remove_button.click()
Saved
Removed
Bei jedem simulierten Klick wird das gespeicherte aufrufbare Objekt aufgerufen und die gebundene Nachricht ausgegeben. Für ein echtes Fenster führen Sie dieses vollständige Tkinter-Skript aus und klicken Sie auf einen der beiden Buttons. Das Label zeigt dann die entsprechende Nachricht und Kategorie an. Die sichtbaren Texte der Buttons und des Labels bleiben Englisch, weil die Code- und Ausgabeblöcke unverändert beibehalten werden:
from functools import partial
def show_message(message, category):
result.config(text=f"{message} ({category})")
try:
import tkinter as tk
except ImportError as error:
print(f"Tkinter is unavailable: {error}")
else:
try:
root = tk.Tk()
except tk.TclError as error:
print(f"A graphical display is required to open the Tkinter window: {error}")
else:
root.title("Button callbacks with partial")
result = tk.Label(root, text="Choose an action")
result.pack(padx=12, pady=8)
tk.Button(
root,
text="Save profile",
command=partial(show_message, "Saved", "profile"),
).pack(padx=12, pady=4)
tk.Button(
root,
text="Remove draft",
command=partial(show_message, "Removed", "draft"),
).pack(padx=12, pady=4)
root.mainloop()
Der Callback erwartet sowohl message als auch category und damit genau die beiden Werte, die jeder Aufruf von partial bindet. partial eignet sich, wenn die Zielfunktion bereits die passende Signatur hat und Sie bei der Zuweisung an command einen oder mehrere Werte binden möchten.
Argumente mit einer lambda-Funktion übergeben
Ein lambda kann einen Funktionsaufruf umschließen und dessen Argumente bereitstellen, sobald Tkinter den Callback aufruft. Der Ausdruck lambda: show_message("Saved") erzeugt ein aufrufbares Objekt ohne Argumente. Der darin enthaltene Funktionsaufruf erfolgt erst später, wenn der Button angeklickt wird. Die Syntax für ein lambda mit Parametern lautet lambda parameters: expression.
Diese Simulation ohne grafische Oberfläche speichert jedes lambda in einem Button-ähnlichen command-Eintrag und ruft es auf, um einen Klick nachzubilden. Führen Sie das folgende Beispiel aus:
def greet(name):
print(f"Hello, {name}!")
class Button:
def __init__(self, command):
self.command = command
def click(self):
self.command()
ada_button = Button(command=lambda: greet("Ada"))
sam_button = Button(command=lambda: greet("Sam"))
ada_button.click()
sam_button.click()
Hello, Ada!
Hello, Sam!
Bei jedem simulierten Klick wird das gespeicherte lambda aufgerufen und die ausgewählte Begrüßung ausgegeben. Für ein echtes Fenster führen Sie dieses vollständige Tkinter-Skript aus und klicken Sie auf einen der beiden Buttons. Das Label ändert sich dann zur ausgewählten Begrüßung:
def greet(name):
result.config(text=f"Hello, {name}!")
try:
import tkinter as tk
except ImportError as error:
print(f"Tkinter is unavailable: {error}")
else:
try:
root = tk.Tk()
except tk.TclError as error:
print(f"A graphical display is required to open the Tkinter window: {error}")
else:
root.title("Button callbacks with lambda")
result = tk.Label(root, text="Choose a greeting")
result.pack(padx=12, pady=8)
tk.Button(
root,
text="Greet Ada",
command=lambda: greet("Ada"),
).pack(padx=12, pady=4)
tk.Button(
root,
text="Greet Sam",
command=lambda: greet("Sam"),
).pack(padx=12, pady=4)
root.mainloop()
Wählen Sie partial, wenn Sie Werte an eine vorhandene Funktion binden und diese Bindung direkt in der Zuweisung an command sehen möchten. Ein lambda eignet sich, wenn der Aufruf eine kleine Anpassung benötigt oder der Callback-Ausdruck direkt neben dem Button stehen soll. Ein lambda kann auch mehrere Argumente übergeben, etwa mit lambda: show_message("Saved", "profile"). Achten Sie darauf, dass die Zielfunktion diese Werte entgegennimmt. Weisen Sie in beiden Fällen das aufrufbare Objekt selbst command zu. Klammern beim Einrichten des Buttons führen den Callback sofort aus, also noch bevor jemand klicken kann. Wenn ein Button scheinbar nichts tut, prüfen Sie die Schreibweise des Callbacks, ob seine Argumente zur Funktionssignatur passen und ob der Funktionskörper eine sichtbare Aktion ausführt, etwa etwas ausgibt oder ein Widget aktualisiert.