Button
Das Button-Widget von Tkinter ist das zentrale Bedienelement vieler Desktop-Anwendungen: Es löst Aktionen aus, bestätigt Eingaben oder steuert den Ablauf komplexer Workflows. Der Artikel beschreibt, wie Buttons erstellt, gestaltet und mit Events verknüpft werden, welche Optionen für Icons, Text oder Zustände bereitstehen und wie sich Interaktionskonzepte konsistent in bestehende Oberflächen integrieren lassen.
Inhaltsverzeichnis
Widget - Button
Was ist Button?
Ein Button ist in interaktives Widget in Tkinter. Er führt eine Aktion aus, wenn der Nutzer darauf klick.
Wann soll man Button verwenden?
✅ Geeignet für:
- Formular absenden (“Ok”, “Speichern”, “Senden”)
- Aktionen auslösen (“Öffnen”, “Löschen”, “Start”)
- Navigation (“Weiter”, “Zurück”, “Schließen”)
- Funktionen aufrufen (Berechnen, Exportieren, etc.)
- Dialoge öffnen
- Zustandsänderungen (“Start/Stopp”, “Pause/Play”)
⚠️ Weniger geeignet für:
- An/Aus Zustände => Checkbutton
- Auswahl zwischen Optionen => Radiobutton
- Dropdown-Menü => OptionMenu oder Combobox
- Nur Anzeige => Label
Wichtige Button-Konzepte
Callback-Funktion
Man kann bei einem Button eine Callback-Funktion verknüpfen, welche ausgeführt wird, wenn man auf den Button klickt.
def my_function():
print("Button was clicked")
button = tk.Button(
master=root,
text="Click me",
command=my_function
)Wichtig: Die Funktion wird übergeben my_function, nicht aufgerufen (❌) my_function().
Button-States (Zustände)
Ein Button kann folgende Zustände haben.
normal: Button ist klickbar (Standard)active: Button wird gerade geklickt (automatisch)disabled: Button ist deaktiviert und nicht klickbar
Lambda-Funktionen für Parameter
Um an einen Button Parameter zu übergeben, können wir Lambda-Funktion verwenden.
def say_hello(name):
print(f"Hallo {name}")
button = tk.Button(
master=root,
text="Click me",
command=lambda: say_hello("John")
).pack(pady=10)Übersicht - Parameter und Funktionen
Parameter
Hier ist eine Auflistung der wichtigsten Button-Parameter. Einige von diesen Parametern sind identisch mit den Parametern, aus dem Label-Widget.
Aktion & Funktion
| Parameter | Typ | Beschreibung | Beispiel | Hinweise |
|---|---|---|---|---|
command | callable | Funktion bei Klick | command=save_file | OHNE () - sonst sofort ausgeführt! |
Text & Inhalt
| Parameter | Typ | Beschreibung | Beispiel | Hinweise |
|---|---|---|---|---|
text | str | Button-Beschriftung | text="Speichern" | Kann mehrzeilig sein |
textvariable | Variable | StringVar für dynamischen Text | textvariable=var | Text ändert sich automatisch mit Variable |
image | PhotoImage | Bild auf Button | image=icon | Referenz muss erhalten bleiben! |
bitmap | str | Eingebautes Bitmap | bitmap="info" | Built-in Icons |
compound | str | Text+Bild Anordnung | compound="left" | Werte: left, right, top, bottom, center |
Schrift & Farben
| Parameter | Typ | Beschreibung | Beispiel | Hinweise |
|---|---|---|---|---|
font | tuple | Schriftart | font=("Arial", 12, "bold") | (Familie, Größe, Stil) |
fg/foreground | str | Textfarbe | fg="white" | Normalzustand |
bg/background | str | Hintergrundfarbe | bg="#4CAF50" | Normalzustand |
activeforeground | str | Textfarbe beim Klicken | activeforeground="yellow" | Während Mausklick |
activebackground | str | Hintergrundfarbe beim Klicken | activebackground="#45a049" | Visuelles Feedback |
disabledforeground | str | Textfarbe wenn disabled | disabledforeground="gray" | Ausgegraut |
Größe & Layout
| Parameter | Typ | Beschreibung | Beispiel | Hinweise |
|---|---|---|---|---|
width | int | Breite in Zeichen | width=20 | Bei Bild - Pixeln |
height | int | Höhe in Zeichen | height=2 | Bei Bild - Pixeln |
padx | int | Horizontaler Innenabstand | padx=20 | Abstand Text zu Rand |
pady | int | Vertikaler Innenabstand | pady=10 | n, ne, e, se, s, sw, w, nw, center |
anchor | str | Text-Position | anchor="w" | Visuelles Feedback |
justify | str | Ausrichtung bei mehrzeiligem Text | justify="center" | left, center, right |
Rahmen & Stil
| Parameter | Typ | Beschreibung | Beispiel | Hinweise |
|---|---|---|---|---|
relief | str | 3D-Effekt | relief="raised" | flat, raised, sunken, groove, ridge |
bd/borderwidth | int | Rahmendicke | bd=3 | In Pixeln |
highlightthickness | int | Focus-Rahmen | highlightthickness=2 | Rahmen bei Fokus |
highlightbackground | str | Focus-Farbe (ohne Fokus) | highlightbackground="gray" | Sichtbar ohne Fokus |
highlightcolor | str | Fokus-Farbe (mit Fokus) | highlightcolor="blue" | Zeigt Tastatur-Fokus |
Verhalten & Zustand
| Parameter | Typ | Beschreibung | Beispiel | Hinweise |
|---|---|---|---|---|
state | str | Button-Zustand | state="disabled" | normal, active, disabled |
cursor | str | Mauszeiger-Form | cursor="hand2" | z.B. hand2, arrow, cross |
takefocus | bool | Tab-Navigation | takefocus=True | Mit Tab erreichbar |
underline | int | Unterstrichener Buchstabe | underline=0 | Index des Buchstabens (für Shortcuts) |
wraplength | int | Automatischer Zeilenumbruch | wraplength=100 | Text bricht nach n Pixeln um |
default | str | Default-Button | default="active" | Reagiert auf Enter (normal, active, disabled) |
Wichtige Funktionen
| Methode | Beschreibung | Beispiel |
|---|---|---|
configure(**options) | Ändert Optionen | button.config(text="Neu", state="disabled") |
invoke() | Löst Button-Klick aus | button.invoke() |
flash() | Button blinkt kurz | button.flash() |
cget(option) | Liest Option | text = button.cget("text") |
Button-Events
| Event | Wann | Verwendung |
|---|---|---|
<Button-1> | Linksklick | button.bind("<Button-1>", callback) |
<Enter> | Maus betritt | Hover-Effekte |
<Leave> | Maus verlässt | Hover-Effekte entfernen |
<ButtonPress> | Maus gedrückt | Drag-Operationen |
<ButtonRelease> | Maus losgelassen | Drag-Operationen |
Button - Beispiele
Nun schauen wir uns verschiedene Beispiele zur Verwendung von Buttons in Tkinter mit verschiedenen Konfigurationen an.
Grundlegende Verwendung
import tkinter as tk
root = tk.Tk()
root.title("Label - Parameter")
root.geometry("400x200")
my_font=("Noto Sans", 14)
def my_func():
label_one.configure(text="Button geklick")
label_one = tk.Label(
master=root,
text="---",
bg="lightblue",
font=my_font
)
label_one.pack(ipadx=10, pady=10)
tk.Button(
master=root,
text="Klick mich",
command=my_func
).pack(pady=10)
root.mainloop()Wenn wir nun diesen Code ausführen, erhalten wir folgendes Fenster, in welchem wir auf einen Button klicken und eine Funktion auslösen können.


Button Text aktualisieren
Mit Hilfe des text oder des textvariable Parameter ist es möglich den Text am Button zu setzen und auch zu aktualisieren.
In diesem Beispiel schauen wir uns, wie es möglich ist, den Text des Buttons mit textvariable zu aktualisieren.
import tkinter as tk
root = tk.Tk()
root.title("Label - Parameter")
root.geometry("400x200")
my_font=("Noto Sans", 14)
def update_button_text():
global button_value
button_value.set("Neuer Wert")
button_value = tk.StringVar(value="Initialer Wert")
button_one = tk.Button(
master=root,
textvariable=button_value,
bg="lightblue",
font=my_font
)
button_one.pack(ipady=10, ipadx=10, pady=10)
button_two = tk.Button(
master=root,
text="Aktualisiere Text",
font=my_font,
command=update_button_text
)
button_two.pack(pady=10)
root.mainloop()
Führen wir diesen Code aus, können mit einem Button den Text des anderen Buttons aktualisieren. Beachte, dass unter macOS das Styling der Buttons nicht optimal funktioniert und deswegen unsere gesetzte Hintergrundfarbe nicht zu sehen ist. Hier geht allerdings primär um die Änderung des Textes.


Das gleiche Ergebnis erzielen wir, wenn wir statt dem Parameter textvariable den Parameter text verwenden.
import tkinter as tk
root = tk.Tk()
root.title("Label - Parameter")
root.geometry("400x200")
my_font=("Noto Sans", 14)
def update_button_text():
button_one.configure(text="Neuer Wert")
button_one = tk.Button(
master=root,
text="Initialer Wert",
bg="lightblue",
font=my_font
)
button_one.pack(ipady=10, ipadx=10, pady=10)
button_two = tk.Button(
master=root,
text="Aktualisiere Text",
font=my_font,
command=update_button_text
)
button_two.pack(pady=10)
root.mainloop()
Das Ergebnis wird visuell und vom Verhalten her identisch sein.


Bild im Button
Tkinter bietet uns die Möglichkeit, ein Bild im Button zu verwenden. Dafür ist es empfehlenswert die sehr mächtige Bibliothek pillow zu installieren. Um das nach den neusten Python-Standards tun zu können, brauchen wir eine virtuelle Umgebung.
Erstellen wir also einen Ordner und definieren dort eine virtuelle Umgebung.
mkdir button_image
cd ./button_image
python -m venv venv
source venv/bin/activateNun können wir die Bibliothek installieren.
pip install pillowDamit wir auch ein Bild haben, bitte ein bestimtes Bild vorbereiten. In meinem Fall nehme ich folgendes Ausgangsbild.

Nun schreiben wir unseren Code für die Verwendung dieses Bildes in einem Button.
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.title("Button Beispiele")
root.geometry("500x300")
my_font = ("Noto Sans", 14)
my_img = Image.open("./wheel.png")
my_img = my_img.resize((32, 32))
print(my_img.size)
my_photo = ImageTk.PhotoImage(my_img)
button = tk.Button(
master=root,
text="Klick mich",
image=my_photo,
compound="left"
)
button.image = my_photo
button.pack(padx=20, pady=20)
root.mainloop()

Bitmap im Button
Die Bitmaps werden nicht so oft verwenden, können aber problemlos. Der Vorteil ist, dass es einige eingebaute gibt, welche sofort verwendet werden können.
import tkinter as tk
root = tk.Tk()
root.title("Button Beispiele")
root.geometry("500x300")
my_font = ("Noto Sans", 14)
button = tk.Button(
master=root,
text="Klick mich",
bitmap="info",
compound="left"
)
button.pack(padx=20, pady=20, ipady=10, ipadx=10)
root.mainloop()

Position im Button
Nun schauen wir uns den Parameter compound einmal an. Dafür brauchen wir wieder ein Bild. In meinem Fall werde ich das Bild von oben (Zahnrad) verwenden.
Denkt dran, wir brauchen hier wieder eine virtuelle Umgebung.
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
root.title("Button Beispiele")
root.geometry("500x400")
my_font = ("Noto Sans", 14)
my_img = Image.open("./wheel.png")
my_img = my_img.resize((32, 32))
my_photo = ImageTk.PhotoImage(my_img)
positions = ["left", "right", "top", "bottom", "center"]
for pos in positions:
button = tk.Button(
master=root,
text=f"compound='{pos}'",
image=my_photo,
compound=pos,
padx=10,
pady=5
)
button.image = my_photo
button.pack(pady=5)
root.mainloop()Das Ergebnis zeigt, wie das Bild und Text jeweils im Button angeordnet sein wird, in Abhängigkeit davon, welcher Wert beim compound Parameter verwendet wurde.

Schrift im Button
Die Schrift für einen Button wird fast identisch wie beim Label verwendet.
Dazu ein kleines Beispiel mit mehreren Ausführungen.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("500x300")
fonts = [
("Arial", 14),
("Noto Sans", 14),
("Noto Sans Mono", 14, "bold"),
("IowideMono", 16)
]
for f in fonts:
tk.Button(
master=root,
text=f[0],
font=f,
padx=20,
pady=5
).pack(pady=5)
root.mainloop()
Als Ergebnis erhalten wir folgende Buttons mit unterschiedlichen Schrift-Konfigurationen. Beachte, dass bestimmte Schriften, welche nicht direkt als Datei eingebunden sind, auf dem System installiert sein müssen.

Schriftfarbe im Button
Für die Änderung der Schriftfarbe wird der Parameter fg bzw. foreground (voll ausgeschrieben) verwendet.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("500x300")
my_font = ("Noto Sans", 16)
colors = ["#246990", "#aa1313", "#298720"]
for c in colors:
button = tk.Button(
master=root,
text="Ein Button",
font=my_font,
fg=c
)
button.pack(pady=20)
root.mainloop()Trotz der Tatsache, dass in macOS die Button (tk-Version) nicht vollständig die Anpassungen übernehmen, funktioniert dieser Parameter sehr wohl.

Hintergrundfarbe des Buttons
Das ist der Fall, welche unter macOS nicht funktioniert. Hier wird die Hintergrundfarbe nicht korrekt angewendet. Unter Linux und Windows sollte es normal funktionieren.
Hier der Code des Beispiels.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("500x300")
my_font = ("Noto Sans", 16)
colors = ["#246990", "#aa1313", "#298720"]
for c in colors:
button = tk.Button(
master=root,
text="Ein Button",
font=my_font,
fg="#ffffff",
bg=c
)
button.pack(pady=20)
root.mainloop()Hintergrundfarbe beim Klick
Hier ist die Situation ähnlich. Unter macOS kann ich nicht vollständig euch einen Screenshot bieten, da die Hintergrundfarbe des Parameters activebackground ignoriert wird.
Die Anwendung würde folgedermaßen aussehen.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("500x300")
my_font = ("Noto Sans", 16)
button = tk.Button(
master=root,
text="Ein Button",
font=my_font,
fg="#ffffff",
activebackgrodun="lightblue"
)
button.pack(pady=20)
root.mainloop()Schriftfarbe beim inaktiven Button
Was wieder korrekt unter allen Betriebssystemen funktionieren sollte, ist die Schriftfarbe eines deaktivierten (inaktiven/ausgegrauten) Buttons.
Hier habe ich 3 unterschiedliche Farben mit unterschiedlichen farblichen Abstufungen verwendet.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("500x300")
my_font = ("Noto Sans", 16)
colors = ["#444444", "#777777", "#bbbbbb"]
for c in colors:
button = tk.Button(
master=root,
text="Ein Button",
font=my_font,
disabledforeground=c,
state="disabled"
)
button.pack(pady=20)
root.mainloop()Wie man nach der Ausführung dieses Codes sehen kann, werden sie korrekt ausgegeben bzw. angewendet.

Größe und Breite des Buttons
Die Parameter width und height behandle ich im nachfolgenden Beispiel im gleichen Schritt, da diese bis auf die Namen der Parameter und ihre Richtung sonst nahezu identisch verhalten.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("700x300")
my_font = ("Noto Sans", 16)
dimensions = [
(10, 2),
(15, 4),
(20, 8)
]
frame = tk.Frame(
master=root
)
frame.pack()
for d in dimensions:
button = tk.Button(
master=frame,
text="Ein Button",
font=my_font,
width=d[0],
height=d[1]
)
button.pack(pady=20, side="left")
root.mainloop()Als Ergebnis wir 3 Button, die sowohl in der Breite als auch in der Höhe wachsen.

Abstand im Button
Mit den Parametern padx und pady lässt sich der Innenabstand in einem Button steuern. Während pady für vertikalen Innenabstand zuständig ist, verantwortet padx den horizontalen Innenabstand.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("700x300")
my_font = ("Noto Sans", 16)
for i in range(10, 40, 10):
tk.Button(
master=root,
text=f"padx/pady = {i}",
font=my_font,
padx=i,
pady=i
).pack(pady=5)
root.mainloop()

Ausrichtung im Button
Mit dem Parameter anchor ist es möglich, den Text im Button auszurichten. Folgende Ausrichtungsmöglichkeiten stehen dabei zur Verfügung.
n: Oben mittig (Nord)ne: Oben rechts (Nord-Ost)e: Rechts mittig (Ost)se: Unten rechts (Süd-Ost)s: Unten mittig (Süd)sw: Unten links (Süd-West)w: Links mittig (West)nw: Oben links (Nord-West)center: Zentriert
Schauen wir uns wie immer dies an einem Beispiel an. Damit die Buttons besser platziert werden können, habe ich diesmal den Grid Layout-Manager verwendet.
import tkinter as tk
root = tk.Tk()
root.title("Button - Beispiele")
root.geometry("800x300")
my_font = ("Noto Sans", 16)
anchors = ["n", "ne", "e", "se", "s", "sw", "w", "nw", "center"]
cols = 3
for i, a in enumerate(anchors):
btn = tk.Button(
master=root,
text=f"Ausrichtung: {a}",
font=my_font,
anchor=a,
height=2,
width=14
)
current_row = i // cols
current_col = i % cols
btn.grid(
row=current_row,
column=current_col,
padx=5,
pady=5
)
root.mainloop()
