以下Python 3代码具有标签和Entry字段,这些字段使用字符串正确初始化(示例中为“垃圾”)。但是当第二个“导入”行被取消注释以用新的主题小部件替换旧的Entry小部件时,标签和Entry字段不会被初始化。
为什么主题小部件初始化被破坏的任何线索?
from tkinter import *
# from tkinter.ttk import *
class myApp:
def __init__(self, root):
v = StringVar()
v.set("junk")
label = Label(root, textvariable=v)
label.pack()
text_entry = Entry(root, textvariable=v)
text_entry.pack()
root = Tk()
root.title("MyApp")
app = myApp(root)
root.mainloop()
答案 0 :(得分:5)
问题是v
是一个局部变量。当它超出范围时(即:__init__
完成执行时),v
将被垃圾收集。将v
更改为self.v
,问题就会消失。
为什么你看到ttk Entry小部件的问题而不是标准的小部件,我不知道。我猜一个人对垃圾收集器更敏感,或者可能导入两个库以某种方式更快地触发垃圾收集器。无论如何,即使使用库存小部件,您最终也会遇到某种问题,因为v
最终会被垃圾收集。