In diesem Beitrag werden wir uns in Tkinter StringVar, IntVar, DoubleVar und BooleanVar ansehen. Im vergangenen Artikel hast du bereits die unterschiedlichen Optionen kennengelernt, die wir für TTK-Labelobjekte setzen können. Eine dieser Optionen, nämlich die Option textvariable möchte ich in diesem Beitrag außerdem noch gesondert erklären, da es bei dieser einiges zu beachten gibt.
Inhaltsverzeichnis
1. Die Option text
Bisher haben wir nur die Option text verwendet, welcher wir einen String zuweisen konnten, der dann als Text des Labels angezeigt wurde.
Auf der obenstehenden Abbildung sehen wir ein kleines Beispiel, das diese Option veranschaulicht.
Wir sehen darauf, dass wir die text-Option gesetzt und dieser den String „Das ist ein String“ zugewiesen haben. Wenn wir das Ganze ausführen, wird der String nun als Label angezeigt.
Möchten wir den String nachträglich ändern, könnten wir das zum einen über die configure-Methode beispielsweise folgendermaßen tun:
label1.pack()
label1.configure(text="Neuer Text")
root.mainloop()
Nachdem wir das Programm so ausgeführt haben, zeigt es den neuen Text an:
Alternativ können wir den String auch über die Schlüsselschreibweise ändern, die wir ebenfalls im letzten Blogartikel kennengelernt haben. Dabei gibt man den Schlüssel „text“ zwischen den eckigen Klammern an und weist den neuen Text zu:
label1.pack()
label1["text"] = "Neuer Text"
root.mainloop()
Wenn wir das Programm anschließend noch einmal ausführen, sehen wir, dass es genauso funktioniert. Egal, wie wir es auch machen: wir müssen jedes Mal mit einer manuellen Zeile Code für die Änderung des Wertes sorgen.
2. Kann man Variablen an Labels binden?
Deutlich praktischer wäre es, wenn auch die Möglichkeit bestünde, den Inhalt des Labels an eine Variable zu binden. So würde immer der Inhalt im Label angezeigt werden, der sich aktuell in der Variable befindet, die wir an das Label gebunden haben.
An dieser Stelle definieren wir nun mal eine normale Variable und prüfen anschließend, ob das Vorhaben tatsächlich mit diesen Variablen funktioniert.
Wir nennen diese beispielhaft text_variable und speichern darin den Text „Text der Variable“:
root.geometry("400x400")
text_variable = "Text der Variable"
Die Zeile unten können wir wieder löschen:
label1.pack()
label1["text"] = "Neuer Text"
Jetzt weisen wir dem Schlüsselwortargument text, dem wir aktuell den hartkodierten String „Das ist ein String“ zuweisen, den Inhalt der entsprechenden Textvariable zu, nämlich „text_variable“:
text_variable = "Text der Variable"
label1 = ttk.Label(root, text=text_variable)
label1.pack()
Da der String darin gespeichert ist, sollten wir diesen jetzt gleich sehen. Nach dem Ausführen des Programms, wird der String, den wir in der Variable text_variable gespeichert haben, tatsächlich über das Label angezeigt:
3. Den Inhalt der Variable nachträglich ändern
Was passiert jetzt aber, wenn wir später im Programm den Inhalt der Variable auf den String „Neuer Text“ ändern?
label1.pack()
text_variable = "Neuer Text"
root.mainloop()
Wenn wir den Code jetzt ausführen, sehen wir immer noch den ursprünglichen Wert „Text der Variable“ auf der GUI, der über das Label angezeigt wird, anstatt des neuen Strings:
Die Änderung aktualisiert sich damit nicht im Label, weil der Inhalt der Variable nur einmal an die Textoption des Labels zu dem Zeitpunkt gebunden wird, wenn wir das Labelobjekt erzeugen.
Also genau dann, wenn wir das Labelobjekt erzeugen, wird der Inhalt der Variable an die Textoption zugewiesen. Das bedeutet, dass alle Änderungen, die wir danach an der Variable vornehmen, das Label nicht mehr interessieren. Wir haben den Wert der Text-Variable also nur ein einziges Mal ausgelesen und nicht wirklich an das Label gebunden.
4. Die Variable an das Label binden mit der Option textvariable
Um eine Variable nun an ein Label zu binden, existiert anstatt der text-Option die Option textvariable. Das heißt, wir ändern die Option text in unserem Code zu textvariable:
text_variable = “Text der Variable”
label1 = ttk.Label(root, textvariable=text_variable)
label1.pack()
Wenn wir das Programm jetzt ausführen, sehen wir erst einmal gar nichts, weil das Label leer ist. Das ist ziemlich komisch, da wir schließlich vorhin den String „Text der Variable“ der Variable zugewiesen haben.
Das Problem ist jetzt das Folgende: Die Option textvariable benötigt eine spezielle Variablenart. Wir können also nicht jede beliebige Python-Variable an ein Label binden, sondern nur spezielle Tkinter-Variablen. Eine solche spezielle Variable, die sich an ein Label-Widget binden lässt, ist beispielsweise Tkinter StringVar und kann folgendermaßen erzeugt werden.
5. Die Tkinter StringVar Klasse
Dafür legen wir eine beliebige Python-Variable an, wie zum Beispiel die Text-Variable, die sich ohnehin schon in unserem Programm befindet. Anstatt jetzt aber direkt den Inhalt in Form eines Strings zuzuweisen, weisen wir ein Objekt der speziellen Tkinter StringVar zu. Das setzen wir im Code folgendermaßen um:
root.geometry("400x400")
text_variable = tk.StringVar()
Nun besitzen wir mit der Variable text_variable eine ganz normale Python-Variable, mit der wir auf das Objekt StringVar referenzieren.
Jetzt müssen wir noch den gewünschten Text in die Tkinter-String-Variable einfügen, was wir mit der sogenannten set-Methode umsetzen. Das heißt, wir schreiben darunter im Code text_variable, rufen die set-Methode auf und ergänzen zwischen den runden Klammern „Das ist der neue Text“:
text_variable = tk.StringVar()
text_variable.set("Das ist der neue Text")
Die Referenz dieser Tkinter StringVar haben wir in der text_variable gespeichert und diese ist nach wie vor an die Option textvariable des Label-Widgets gebunden, wodurch wir hier nichts verändern müssen.
Nun löschen wir noch die Zeile, in der wir den neuen Text zuweisen:
label1.pack()
text_variable = "Neuer Text"
Wenn wir das Programm jetzt ausführen, sehen wir, dass der Text, der sich innerhalb der speziellen Tkinter-String-Variable befindet, als Inhalt des Labels auf der GUI ausgegeben wird:
Ziemlich praktisch daran ist jetzt folgendes: Jedes Mal, wenn wir im weiteren Programmverlauf dieser String-Variable einen neuen Wert zuweisen, aktualisiert sich auch der Text des Labels.
6. Mit der set-Methode den Inhalt der Tkinter StringVar ändern
Wir können also irgendwann später im Programm den Text der String-Variable, die wir an das Label gebunden haben, mithilfe der set-Methode verändern und beispielsweise den Text „Aktualisierter Text“ übergeben:
label1.pack()
text_variable.set("Aktualisierter Text")
root.mainloop()
Wenn wir das Programm anschließend ausführen, sehen wir, dass eine Änderung später im Programm sofort wirksam wird und das Label den veränderten Text anzeigt:
Wir haben den Inhalt der Tkinter-String-Variable also tatsächlich an das Label-Objekt gebunden. Das bedeutet, egal wie und wann wir den Inhalt der Tkinter-String-Variable aktualisieren, der angezeigte Text des Labels aktualisiert sich immer automatisch mit.
7. Die Vorteile von Tkinter StringVar
Dadurch sorgen wir dafür, dass der angezeigte Text des Labels dynamisch ist.
Stell dir zum Beispiel folgendes vor: Innerhalb der GUI gibt es einen Button und sobald man diesen klickt, soll ein Label darunter anzeigen „Erfolgreich gesendet“.
Bevor der Button geklickt wurde, soll das Label darunter den Text „Zum Senden klicken“ anzeigen. Das kann man jetzt ideal über solch eine dynamische Tkinter-String-Variable umsetzen.
Ein anderes Beispiel: Du möchtest innerhalb deines Programms gewisse Berechnungen ausführen. Sobald das Programm ein bestimmtes Ergebnis berechnet hat, soll es über ein Label in der GUI angezeigt werden. Auch das lässt sich problemlos über eine dynamische Tkinter-String-Variable umsetzen.
Konkrete Beispiele, die den Sinn hinter diesen String-Variablen verdeutlichen, wirst du in den kommenden Blogartikeln noch in der Praxis sehen.
Mit diesem Beitrag wollte ich dir erst mal zeigen, wie du die speziellen Tkinter-Variablen erzeugen und an ein Widget binden kannst.
8. Wiederholung: So erstellt man eine String-Variable
Du musst also lediglich ein Objekt der Klasse StringVar erzeugen und die Referenz auf dieses Objekt in einer ganz normalen Python-Variable wie in unserem Beispiel „text_variable“ speichern. In dieser Python-Variable ist jetzt die Referenz gespeichert, was bedeutet, dass wir darauf die set-Methode aufrufen und einen gewünschten Wert zuweisen können.
Dann müssen wir diese Python-Variable nur noch an die Option textvariable zuweisen, sodass diese spezielle String-Variable an das Label gebunden ist. Um den Inhalt der Tkinter-Variable zu setzen, verwendet man, wie bereits erwähnt, die set-Methode. Das haben wir in unserem Programm bereits zweimal so umgesetzt.
9. Den Inhalt der Variable mit der get-Methode zurückgeben
Übrigens kann man auch genauso die get-Methode einsetzen, um sich den Inhalt der Variable zurückgeben zu lassen. Das heißt, wir könnten uns zudem den Inhalt der Variable beispielsweise auf der Konsole ausgeben lassen, indem wir darauf die get-Methode aufrufen:
text_variable.set("Aktualisierter Text")
print(text_variable.get())
root.mainloop()
Nachdem wir das Programm so ausgeführt haben, sehen wir den Inhalt tatsächlich auf der Konsole:
10. Die Klasse IntVar
Diese speziellen Tkinter-Variablen gibt es nicht nur als String-Variablen, sondern auch als Integer-, Double- und Boolean-Variablen. Um also anstatt der String- eine Integer-Variable zu erstellen, erzeugt man sich ein Objekt der Klasse IntVar. Wir schreiben damit in unserem Code nun anstelle von StringVar IntVar:
root.geometry("400x400")
text_variable = tk.IntVar()
text_variable.set("Das ist der neue Text")
Da wir jetzt eine IntVar definiert haben, werden wir darin natürlich einen Integer-Wert, also eine Ganzzahl speichern. Bei der Set-Methode übergeben wir dafür beispielhaft die Ganzzahl 10:
text_variable = tk.IntVar()
text_variable.set(10)
Weiter unten aktualisieren wir den Wert zum Beispiel auf die Ganzzahl 20:
label1.pack()
text_variable.set(20)
root.mainloop()
Wenn wir das Programm ausführen, sehen wir, dass die Zahl 20 über das Label angezeigt wird:
11. Die Klasse DoubleVar
Möchten wir eine Kommazahl über eine spezielle Tkinter-Variable speichern, dann erzeugen wir kein Objekt der Klasse IntVar, sondern eins der Klasse DoubleVar.
Dabei könnten wir dann beispielsweise 10,2 oder 20,4 übergeben.
12. Die Klasse BooleanVar
Außerdem haben wir die Möglichkeit, eine sogenannte BooleanVar zu erzeugen. Wir schreiben dafür BooleanVar und übergeben dann einen entsprechenden Wahrheitswert, wofür wir zunächst True festlegen:
root.geometry(“400x400”)
text_variable = tk.BooleanVar()
text_variable.set(True)
Im Nachhinein ändern wir diesen auf False:
label1.pack()
text_variable.set(False)
Wenn wir das Programm ausführen, sehen wir eine Null:
Das liegt daran, dass der Wahrheitswert True als 1 zurückgegeben und über ein Label auch als 1 angezeigt wird. Den Wahrheitswert False zeigt ein Label hingegen als 0 an.
Damit kennst du nun auch die speziellen Tkinter-Variablen und kannst sie fortan an deine Widgets binden.