ttk.Entry的行为与tk.Entry的行为不同

时间:2012-09-11 18:14:48

标签: python tkinter ttk

我正在切换一个小应用程序(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会显示在Entry框中,但如果它是ttk.Entry则不会显示。我如何让他们以同样的方式行事?

1 个答案:

答案 0 :(得分:2)

看来ttk和tk对文本变量的保持稍有不同。似乎根本原因是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()