使用 .set() 时,Tkinter 条目文本未更新(但 textvariable 是)

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

我在 Python 3.9 tkinter 应用程序中为文本输入小部件设置默认值时遇到问题。 我使用 StringVar 作为文本变量,并使用 .set() 更改它。

我正在尝试预设日期(和时间)。

如果我在课堂上执行此操作,即使值已更改,该框也是空的:

class test:
    def __init__(self, root):
        # Content frame widget
        mainframe = ttk.Frame(root, padding="3 3 12 12")
        mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        
        ttk.Label(root, text="Date/Time").grid(
            column=1, row=3, sticky=E, padx=(5, 0)
        )
        self.date_value = StringVar()
        self.date_value.set(datetime.today().strftime("%Y-%m-%d"))
        ttk.Entry(root, width=10, textvariable=self.date_value).grid(column=2, row=3, sticky=E)
        print(self.date_value.get())

root = Tk()
test(root)
root.mainloop()

如果我在课外这样做,它就会起作用。

root = Tk()

mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))

ttk.Label(root, text="Date/Time").grid(
    column=1, row=3, sticky=E, padx=(5, 0)
)
date_value = StringVar()
date_value.set(datetime.today().strftime("%Y-%m-%d"))
ttk.Entry(root, width=10, textvariable=date_value).grid(column=2, row=3, sticky=E)
print(date_value.get())

root.mainloop()

奇怪的是,我有时确实会在第一个示例中看到它工作,当我的代码中存在其他一些错误导致后续错误时,它会正确显示并填充日期。

我确信我错过了一些非常明显的东西,但很想知道它是什么!

python tkinter tkinter-entry
1个回答
0
投票

因为

test()
的实例没有存储在变量中,所以创建后会被垃圾回收。

只需将实例分配给变量即可:

...
root = Tk()
app = test(root)
root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.