Label zeigt keinen Text bei Verwendung von stringVar()

Fragen zu Tkinter.
Antworten
RogerWilco77
User
Beiträge: 8
Registriert: Sonntag 27. September 2015, 20:33

Montag 22. Februar 2021, 08:30

Guten Morgen,

nach langer Pause habe ich den Weg wieder zu Python gefunden, leider mit Hürden:
während das zweite Label korrekt mit Text angezeigt wird, bleibt das erste leer.

Als Vorlage habe ich folgenden Code verwendet:
https://github.com/roseman/tkdocs/blob/master/f2mo.py

Code: Alles auswählen

from tkinter import *
from tkinter import ttk


class Exercise:

    def __init__(self, root):

        root.title("Some Window")
        mainframe = ttk.Frame(root)
        mainframe.grid(column=0, row=0)
        self.value = StringVar()
        self.value.initialize('init text')

        ttk.Label(mainframe, textvariable=self.value).grid(column=0, row=1)
        ttk.Label(mainframe, text='another label').grid(column=0, row=2)

        print(self.value.get())
        self.value.set('new text')
        print(self.value.get())

root = Tk()
Exercise(root)
root.mainloop()
Die Konsole gibt folgendes aus:
init text
new text
Also wurde die Variable korrekt zugewiesen, aber warum wird der Text im Label nicht angezeigt?
Vielen Dank und allen einen guten Start in die neue Woche.
Benutzeravatar
__blackjack__
User
Beiträge: 8104
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Montag 22. Februar 2021, 08:46

@RogerWilco77: Zu dem Zeitpunkt wo Du die GUI-Hauptschleife aufrufst gibt es kein `StringVar`-Objekt mehr weil es kein `Exercise`-Objekt mehr gibt, weil Du das nicht an einen Namen bindest.

Ansonsten sollte noch der Sternchen-Import weg und das Hauptprogramm in einer eigenen Funktion stehen. Und die Klasse macht hier (noch) keinen Sinn.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from tkinter import ttk


class Exercise:
    def __init__(self, root):
        root.title("Some Window")
        frame = ttk.Frame(root)
        frame.grid(column=0, row=0)
        self.value = tk.StringVar(value="init text")

        ttk.Label(frame, textvariable=self.value).grid(column=0, row=1)
        ttk.Label(frame, text="another label").grid(column=0, row=2)

        print(self.value.get())
        self.value.set("new text")
        print(self.value.get())


def main():
    root = tk.Tk()
    _excercise = Exercise(root)
    root.mainloop()


if __name__ == "__main__":
    main()
“Unfortunately forty years of programming experience has taught me that there's an essentially infinite supply of mistakes to make … your mistakes just get smarter most of the time.” — Steve Holden
RogerWilco77
User
Beiträge: 8
Registriert: Sonntag 27. September 2015, 20:33

Montag 22. Februar 2021, 23:38

Vielen Dank, @__blackjack__, insbesondere für die Erläuterung für das Verständnis.
Wenn man es dann liest und erklärt bekommt, ist es eigentlich ganz logisch... :-)
Antworten