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

Python 无法使用textvariable参数为ttk条目小部件显示默认值,python,tkinter,ttk,Python,Tkinter,Ttk,好的,我通过在def initUI函数中将对stringvar“commentryvar”的所有引用更改为“self.commentryvar”来实现这一点 我不太清楚为什么这是必要的(或者是否所有的引用self.commentryvar都是必要的)。如果有人能解释为什么这解决了问题,我会很高兴 self.commentEntryVar = tk.StringVar() self.commentEntryVar.set("default text") print "commentEntryVar

好的,我通过在def initUI函数中将对stringvar“commentryvar”的所有引用更改为“self.commentryvar”来实现这一点

我不太清楚为什么这是必要的(或者是否所有的引用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的值,但这并不影响窗口的显示——“set comment”字段仍然为空

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

print "commentEntryVar"
print commentEntryVar.get()

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

确保保留
StringVar
对象的引用

例如,尝试以下带有/不带
delcommentrywidget
语句的示例

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()

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

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

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的引用,这样它就不会被垃圾收集。在这段代码中,我们使用一个类,这样我们就可以在类变量中存储一个引用。如果不使用类和对象,则需要将其存储在全局变量中

例如,如果将
commentryvar
更改为
self.commentryvar
,则问题会消失,因为对象持有持久引用:

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

正如我发表评论时所写的,你的问题很难理解。如果你需要问一个后续问题,可以单独问。请不要完全改变你所问的,因为这会使所有答案无效。不确定这会起什么作用。以“del commentrywidget”和“del commentrywidget”的形式运行此片段,都显示了带有“默认文本”的相同UI窗口。