以下代码将两个tkinter Entry字段打包到根tk窗口中。显示的文本通过tkinter.Entry
设置。创建两个字段的函数是相同的,除了一个创建tkinter.ttk.Entry
对象而另一个创建tkinter.Entry
对象。
根据Shipman的文字,tkinter.ttk.Entry
和textvariable
都有.get()
选项。它们都引用.set()
的相同StringVar
和ttk.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()
无法显示文字?
(MS Windows 7上的Python 3.5.1)
byte[]
答案 0 :(得分:1)
由于实现方面的差异,小部件的ttk版本很容易被垃圾收集。如果你保持对变量的持久引用,你的代码将起作用。例如,如果您在global var_text
中添加label_2
,则会有效。
我个人认为使用带有StringVar
小部件的Entry
没有任何价值,除非您依赖于类的某些特殊功能,例如变量跟踪,或者将多个小部件连接到相同的变量。
注意:在这些函数中调用update_idletasks
是完全没有意义的。这是双重真实,因为您在调用pack
之前调用它。也就是说,在您调用pack
或grid
或place
之前,不会为此特定小部件的空闲队列添加任务。 update_idletask
只会影响已添加到屏幕但尚未绘制的小部件。
虽然你认为它没有副作用,但实际上确实如此。调用update_idletasks
刷新所有空闲任务,而不仅仅是在此函数中创建的任务。话虽如此,它是无害的,因为它只会导致屏幕刷新,一旦调用mainloop就会发生这种情况。