下面的代码将两个tkinter入口字段打包到根tk窗口中。显示的文本是通过StringVar
设置的。创建这两个字段的函数是相同的,只是一个创建tkinter.Entry
对象,另一个创建tkinter.ttk.Entry
对象。
根据Shipman的文本,tkinter.Entry
和tkinter.ttk.Entry
都有textvariable
选项。它们都引用了相同的.get()
和.set()
方法,用于StringVar
。我一直找不到任何表明ttk.Entry
类需要单独处理的东西。
为什么ttk.Entry
不能显示文本?
(Python 3.5.1在MS Windows 7上)
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()
发布于 2016-04-17 11:41:13
由于实现上的差异,小部件的ttk版本很容易让变量被垃圾收集。如果您保持对变量的持久引用,您的代码就会工作。例如,如果在global var_text
中添加label_2
,它就会工作。
就我个人而言,我认为在StringVar
小部件中使用Entry
没有任何价值,除非您依赖于类的一些特殊特性,例如变量跟踪,或者将多个小部件连接到同一个变量。
注意:在这些函数中调用update_idletasks
是完全没有意义的。这是双重事实,因为您在调用pack
之前调用它。也就是说,在调用pack
、grid
或place
之前,不会将任务添加到这个特定小部件的空闲队列中。update_idletask
只会影响已经添加到屏幕上但尚未绘制的小部件。
虽然你认为它没有副作用,但实际上是这样的。调用update_idletasks
刷新所有空闲任务,而不仅仅是在此函数中创建的任务。尽管如此,它是无害的,因为它所做的只是导致屏幕刷新,无论如何,只要调用main循环,就会发生刷新。
https://stackoverflow.com/questions/36681159
复制相似问题