Label zeigt keinen Text bei Verwendung von stringVar()

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

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: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
RogerWilco77
User
Beiträge: 8
Registriert: Sonntag 27. September 2015, 20:33

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