Tkinter:当在类中将 StringVar 作为文本变量给出时,ttk.Label 不显示任何内容

问题描述 投票:0回答:2

我正在尝试使用

textvariable
ttk.Label
属性来根据给定的
StringVar
显示和更新文本。

from tkinter import *
from tkinter import ttk

class RenderEvent():
    def __init__(self, root):
        self.root = root
        self.frame = ttk.Frame(self.root, padding="20 20 20 20")
        self.frame.grid(column=0, row=0, sticky=(N, W, E, S))
        
        self.dialogue = StringVar(self.frame, value="Placeholder")
        L = ttk.Label(self.frame, textvariable=self.dialogue)
        L.grid(column=1, row=2, sticky=W)
        self.dialogue.set("some text here")

供参考,

root
是从另一个类似这样的文件传入的,用于启动应用程序:

from tkinter import *
from tkinter import ttk
from renderevent import RenderEvent

root = Tk()
RenderEvent(root)
root.mainloop()

如果我在标签创建中使用

text
而不是
textvariable
,它会很好地显示静态字符串。然而,一旦设置为
textvariable
(如上所示),就不会显示任何内容。

我也尝试过在初始化时不给 StringVar() 任何参数,或者传入

self.root

在类之外模拟此代码似乎按预期工作(文本与

textvariable
一起出现和更新),但我无法想象为什么有一个类会导致这样的问题。

python tkinter ttk
2个回答
0
投票

原因是您没有保留对

RenderEvent
实例的引用。由于您不保存引用,Python 的垃圾收集器将尝试清理它,这会导致变量也被清理。 ttk 小部件对此比普通 tk 小部件更敏感。

简单且可以说是最好的解决方案是将

RenderEvent(root)
的结果分配给一个变量,这样它就不会受到 python 内存管理的影响。

re = RenderEvent(root)

0
投票

由于我没有足够的代表对 Bryan Oakley 发表评论,我想说这目前对我有用。我有多个

ttk.Frames
textvaribales
未正确加载且在类中的位置。

© www.soinside.com 2019 - 2024. All rights reserved.