无法使用textvariable参数为for ttk entry小部件显示默认值

2024-05-29 02:32:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我把对stringvar“commentryvar”的所有引用改为self.commentryvar“在def initUI函数中。在

我不太清楚为什么这是必要的(或者如果做所有的参考self.commentryvar是必要的)。如果有人能解释为什么这解决了这个问题。在

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公司,但它不会影响窗口显示--“设置注释”字段保持空白。在

^{pr2}$

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


Tags: 函数selfdefaultdeftkprintttkset
2条回答

请确保保留StringVar对象的引用。在

例如,尝试下面的例子with/withoutdel 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()

如果我理解你的代码,你做的每件事在语法上都是正确的。如果该值在屏幕上显示为空白,唯一的解释是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,则问题将消失,因为该对象包含一个持久引用:

^{pr2}$

相关问题 更多 >

    热门问题