tkinter Entry上的StringVar有效。 ttk.Entry上的StringVar失败

时间:2016-04-17 19:26:06

标签: tkinter

以下代码将两个tkinter Entry字段打包到根tk窗口中。显示的文本通过tkinter.Entry设置。创建两个字段的函数是相同的,除了一个创建tkinter.ttk.Entry对象而另一个创建tkinter.Entry对象。

根据Shipman的文字,tkinter.ttk.Entrytextvariable都有.get()选项。它们都引用.set()的相同StringVarttk.Entry方法。我一直无法找到任何暗示ttk.Entry课程需要单独处理的内容。

为什么import tkinter import tkinter.ttk def label_2(root): label = tkinter.ttk.Entry(root) var_text = tkinter.StringVar(name='StringVar 2') label.config(textvariable=var_text) var_text.set('variable label 2') root.update_idletasks() # Shipman recommended precaution has no effect here print(var_text, var_text.get(), label.get()) label.pack() def label_3(root): label = tkinter.Entry(root) var_text = tkinter.StringVar(name='StringVar 3') label.config(textvariable=var_text) var_text.set('variable label 3') root.update_idletasks() # Shipman recommended precaution has no effect here print(var_text, var_text.get(), label.get()) label.pack() if __name__ == '__main__': root = tkinter.Tk() label_2(root) label_3(root) root.mainloop() 无法显示文字?

enter image description here

(MS Windows 7上的Python 3.5.1)

byte[]

1 个答案:

答案 0 :(得分:1)

由于实现方面的差异,小部件的ttk版本很容易被垃圾收集。如果你保持对变量的持久引用,你的代码将起作用。例如,如果您在global var_text中添加label_2,则会有效。

我个人认为使用带有StringVar小部件的Entry没有任何价值,除非您依赖于类的某些特殊功能,例如变量跟踪,或者将多个小部件连接到相同的变量。

注意:在这些函数中调用update_idletasks是完全没有意义的。这是双重真实,因为您在调用pack之前调用它。也就是说,在您调用packgridplace之前,不会为此特定小部件的空闲队列添加任务。 update_idletask只会影响已添加到屏幕但尚未绘制的小部件。

虽然你认为它没有副作用,但实际上确实如此。调用update_idletasks刷新所有空闲任务,而不仅仅是在此函数中创建的任务。话虽如此,它是无害的,因为它只会导致屏幕刷新,一旦调用mainloop就会发生这种情况。