无法使用textvariable参数为ttk条目窗口小部件显示默认值

时间:2014-05-07 13:51:24

标签: python tkinter ttk

好的,我通过更改对stringvar" commentEntryVar"的所有引用来使其工作。 to" self.commentEntryVar"在def initUI函数中。

我不确定为什么这是必要的(或者如果必须使用所有引用self.commentEntryVar)。如果有人可以解释为什么这解决了这个问题,那将会很高兴。

self.commentEntryVar = tk.StringVar()
self.commentEntryVar.set("default text")
print "commentEntryVar"
print self.commentEntryVar.get()
commentEntryWidget = ttk.Entry(workoutParametersFrame, textvariable=self.commentEntryVar)
commentEntryWidget.grid(row=6, column=1)

========================================= (原始问题)

尝试使用" textvariable"为ttk条目小部件设置默认文本的方法。我似乎正确设置了tk.StringVar的值,但它并没有影响窗口显示 - 设置注释'领域仍然是空白。

commentEntryVar = tk.StringVar()
commentEntryVar.set("default text")

print "commentEntryVar"
print commentEntryVar.get()

commentEntryWidget = ttk.Entry(workoutParametersFrame, textvariable=commentEntryVar)
commentEntryWidget.grid(row=6, column=1)

Shows the 'set comment' field blank instead of showing default text

2 个答案:

答案 0 :(得分:3)

如果我理解你的代码,那么你在语法上正确地做了一切。如果该值在屏幕上显示为空白,则唯一的解释是commentEntryVar是在创建窗口小部件之后但在窗口出现之前进行垃圾收集的局部变量。

如果它是局部变量,当函数退出时,变量将被销毁,因此默认值将被丢弃。例如,这个最小程序说明了您使用局部变量后所看到的效果:

import Tkinter as tk
import ttk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        workoutParametersFrame = tk.Frame(self)
        workoutParametersFrame.pack(fill="both", expand=True);

        # start code from the question
        commentEntryVar = tk.StringVar()
        commentEntryVar.set("default text")

        print "commentEntryVar"
        print commentEntryVar.get()

        commentEntryWidget = ttk.Entry(workoutParametersFrame, 
                                       textvariable=commentEntryVar)
        commentEntryWidget.grid(row=6, column=1)
        # end code from the question

if __name__ == "__main__":
    root = tk.Tk()
    app = Example(root)
    app.pack(fill="both", expand=True)
    app.mainloop()

修复是保持对StringVar的引用,以便它不被垃圾回收。在这段代码中,我们使用了一个类,因此我们可以在类变量中存储引用。如果您不使用类和对象,则需要将其存储在全局变量中。

例如,如果您将commentEntryVar更改为self.commentEntryVar,则问题就会消失,因为该对象包含持久性引用:

...
self.commentEntryVar = tk.StringVar()
...
commentEntryWidget = ttk.Entry(..., textvariable=self.commentEntryVar)
...

答案 1 :(得分:0)

确保保留StringVar对象的引用。

例如,尝试使用/不带del commentEntryWidget语句的示例。

try:
    import Tkinter as tk
    import ttk
except ImportError:
    import tkinter as tk
    from tkinter import ttk

root = tk.Tk()
commentEntryVar = tk.StringVar()
commentEntryVar.set("default text")
commentEntryWidget = ttk.Entry(root, textvariable=commentEntryVar)
commentEntryWidget.grid(row=6, column=1)
# del commentEntryWidget
root.mainloop()