1

我正在切换一个小应用程序(Win 7/64 上的 Python 2.7.3/32)来使用 ttk,但我无法让 ttk.Entry 像 tk.Entry 那样工作;当我设置它的内容时,ttk.Entry 没有更新显示的输入框:

import Tkinter as tk
import ttk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        part_num = '1234'
        newPNVar = tk.StringVar()
        newPN = ttk.Entry(self, width=13, textvariable=newPNVar)
        newPNVar.set(part_num)
        newPN.pack()
        #newPN.insert(0, part_num)  also didn't work

        print newPNVar.get()


app = SampleApp()
app.mainloop()

如果我用 tk.Entry 替换 ttk.Entry 并运行示例,则 1234 会显示在“条目”框中,但如果它是 ttk.Entry 则不会。我如何让他们以同样的方式行事?

4

1 回答 1

2

似乎 ttk 和 tk 对 text 变量的保留略有不同。似乎根本原因是newPNVar因为您没有保留参考,所以正在收集垃圾。这似乎不影响tk.Entry,但确实影响ttk.Entry

快速解决方法是保留对newPNVar(例如:)的引用self.newPNVar,无论这种行为差异如何,这可能都是明智之举。

这在 Windows 上适用于我:

import Tkinter as tk
import ttk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        part_num = '1234'
        self.newPNVar = tk.StringVar()
        newPN = ttk.Entry(self, width=13, textvariable=self.newPNVar)
        self.newPNVar.set(part_num)
        newPN.pack()
        #newPN.insert(0, part_num)  also didn't work

        print self.newPNVar.get()


app = SampleApp()
app.mainloop()
于 2012-09-11T22:15:41.147 回答