Button/Schaltfläche erstellen auf GUI mit Tkinter
Für eine Benutzeraktion bieten sich Buttons an, die wir in unserem Fenster platzieren können und die wir mit Aktionen hinterlegen können.
import tkinter as tk
root = tk.Tk()
# Textausgabe erzeugen
label1 = tk.Label(root, text="Hallo Welt")
label1.pack()
schaltf1 = tk.Button(root, text="Aktion durchführen")
schaltf1.pack()
root.mainloop()
Das erzeugt uns eine Schaltfläche, die zwar noch nichts tut, aber schon einmal angezeigt wird.
Die Schreibweise über 2 Zeilen mit pack() können wir noch kürzer machen, indem wir das Pack an unsere Anweisung tk.Button().pack()
„anheften“ (diese Schreibweise klappt bei allen Elementen, so auch bei dem Label für die Textausgabe). Das macht unseren Code schlanker (was zum Lernen suboptimal ist, aber man mal gesehen haben sollte):
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="Hallo Welt").pack()
schaltf1 = tk.Button(root, text="Aktion durchführen").pack()
root.mainloop()
Auch die Platzierung der Schaltfläche können wir wie beim Label-Widget über side="left|center|right")
beeinflussen.
label1 = tk.Label(root, text="Hallo Welt").pack(side="left")
schaltf1 = tk.Button(root, text="Aktion durchführen").pack(side="right")
Button/Schaltfläche mit Aktion verknüpfen
Jetzt belegen wir unsere Schaltfläche mit einer Aktion. Dazu geben wir dem Button-Widget noch das Attribut command=Funktionsaufruf
mit:
schaltf1 = tk.Button(root, text="Aktion durchführen", command=aktionSF)
schaltf1.pack()
Zusätzlich benötigen wir noch eine Funktion, die etwas macht. Hier nutzen wir die „Beenden“-Funktion von Tkinter .destroy
.
schaltf1 = tk.Button(root, text="Fenster schließen", command=tk.destroy)
schaltf1.pack()
Mit anklicken der Schaltfläche wird also unser Tkinter-Fenster geschlossen. Hier der komplette Code:
import tkinter as tk
root = tk.Tk()
label1 = tk.Label(root, text="Hallo Welt", bg="orange")
label1.pack()
schaltf1 = tk.Button(root, text="Aktion durchführen", command=root.destroy)
schaltf1.pack()
root.mainloop()
Im nächsten Schritt wollen wir eigene Aktionen mit der Schaltfläche „verbinden“.
Eigene Aktionen mit Buttons verbinden
Wir lassen einfach eine Ausgabe im Fenster erfolgen. Das Attribut command
erhält nun als Wert den Funktionsnamen übergeben.
import tkinter as tk
def aktionSF():
label3 = tk.Label(root, text="Aktion durchgeführt", bg="yellow")
label3.pack()
root = tk.Tk()
label1 = tk.Label(root, text="Hallo Welt", bg="orange")
label1.pack()
schaltf1 = tk.Button(root, text="Aktion durchführen", command=aktionSF)
schaltf1.pack()
root.mainloop()
Jedes Mal, wenn wir nun die Schaltfläche anklicken erweitert sich das Fenster mit der Ausgabe „Aktion durchgeführt“.
Inhalte auslesen und verarbeiten
Hier kommt der Begriff der Steuerelementvariablen ins Spiel. Von Python kennen wir verschiedene Datentypen wie String, Integer, Float und Bool.
Um diese in Tkinter nutzen zu können, müssen die Benennung von Tkinter genutzt werden.
Datentyp Tkinter | Datentyp Python-Datentyp |
---|---|
tkinter.StringVar | str |
tkinter.IntVar | int |
tkinter.DoubleVar | float |
tkinter.BooleanVar | bool |
Wir wollen in unserem kleinen Programm ein Feld mit einer Zahl auslesen und die Gradangabe in Kelvin umrechnen. Mathematisch schön einfach, da wir einfach zu Gradangabe einfach 273 dazurechnen. Dazu müssen wir für unser Feld Entry
die Art der Textvariable mitgeben – in folgendem Beispiel ein String über tkinter.StringVar
eingabefeld_wert=tk.StringVar()
eingabefeld=tk.Entry(root, textvariable=eingabefeld_wert)
eingabefeld.pack()
Auf den vom Benutzer eingegebenen Inhalt wollen wir nun zugreifen, wenn der Button angeklickt wird:
schaltf1 = tk.Button(root, text="Aktion durchführen", command=grad_nach_kelvin)
schaltf1.pack()
Und es wir nun die Funktion grad_nach_kelvin
aufgerufen.
In der Funktion lassen wir zu Kontrolle einfach den Wert ausgeben. Unser erster Test dazu:
def grad_nach_kelvin():
print(eingabefeld_wert)
Als Ergebnis erhalten wir nur:
PY_VAR0
Was müssen wir machen, um auf den eigentlichen Inhalt zuzugreifen? Wir müssen diese mit get()
auslesen! Nun erhalten wir auch den eingegebenen Inhalt. Aber warum nutzen wir hier Strings und nicht einen numerischen Datentyp? Probieren wir einfach einmal aus, was passiert, wenn wir tk.IntVar()
anstelle von tk.StringVar()
nutzen.
Solange der Nutzer Ganzzahlen eingibt, ist alles gut. Sobald er versehentlich Text eingibt und der Button geklickt wird, wird Python einen Fehler.
Es ist also gerade einfacher für uns, alle Eingaben zuzulassen und dann die Eingabe zu „casten“ (siehe entsprechendes Kapitel):
Jetzt fehlt uns noch die Umrechnung von Grad Celsius in Kelvin. Hier die Formal dazu:
def grad_nach_kelvin():
# print(eingabefeld_wert.get())
grad = int(eingabefeld_wert.get())
kelvin = grad + 273
textausgabe = tk.Label(root, text=kelvin, bg="yellow")
textausgabe.pack()
Und schon haben wir einen Umrechner, den man garantiert jeden Tag benötigt :)
Der komplette Code:
import tkinter as tk
root = tk.Tk()
def grad_nach_kelvin():
# print(eingabefeld_wert.get())
grad = int(eingabefeld_wert.get())
kelvin = grad + 273
textausgabe = tk.Label(root, text=kelvin, bg="yellow")
textausgabe.pack()
eingabefeld_wert=tk.StringVar()
eingabefeld=tk.Entry(root, textvariable=eingabefeld_wert)
eingabefeld.pack()
schaltf1 = tk.Button(root, text="Aktion durchführen", command=grad_nach_kelvin)
schaltf1.pack()
root.mainloop()
Aussehen Button verändern
Es gibt weitere Attribute, um das Aussehen der Schaltfläche zu verändern. Hier eine Liste zum selber testen. Ich denke, die jeweilige Möglichkeit ist klar:
highlightthickness="20"
highlightbackground="white", highlightcolor="blue"