我正在尝试使用
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
一起出现和更新),但我无法想象为什么有一个类会导致这样的问题。
原因是您没有保留对
RenderEvent
实例的引用。由于您不保存引用,Python 的垃圾收集器将尝试清理它,这会导致变量也被清理。 ttk 小部件对此比普通 tk 小部件更敏感。
简单且可以说是最好的解决方案是将
RenderEvent(root)
的结果分配给一个变量,这样它就不会受到 python 内存管理的影响。
re = RenderEvent(root)
由于我没有足够的代表对 Bryan Oakley 发表评论,我想说这目前对我有用。我有多个
ttk.Frames
和 textvaribales
未正确加载且在类中的位置。