在tkinter中创建组合框时使用textvariable
属性似乎完全没有用。有人能解释一下目的是什么吗?我查看了Tcl文档,上面说textvariable
用于设置默认值,但在tkinter中,您只需使用.set
方法来设置默认值。在
示例说明我的意思:
这不管用。。。在
from Tkinter import *
import ttk
master = Tk()
test = StringVar()
country = ttk.Combobox(master, textvariable=test)
country['values'] = ('USA', 'Canada', 'Australia')
country.pack()
# This does not set a default value...
test="hello"
mainloop()
这确实有效。在
^{pr2}$如果只使用.set
和.get
方法,那么给textvariable
赋值有什么意义呢?每个在线示例似乎都使用textvariable
,但为什么呢?这似乎完全没有意义。在
由于Python没有类型安全性,所以使用字符串覆盖对
StringVar
对象的引用。要设置该值,请调用set
方法:正如sqall指出的,要更改
StringVar
值,需要使用其set()
方法。在另一方面,Tk变量的目的是跟踪它们所连接的小部件的值。您应该选择使用
StringVar
而不是直接读取小部件的值的原因是后者是线程安全的。在线程安全对于tkinter来说有点棘手,但从技术上讲,您不应该被允许在与创建窗口的线程不同的线程中对GUI元素进行修改(即,原始线程被阻塞在
mainloop()
加上您定义的回调)。在如果您有一个额外的后台线程,该线程使用
country.set("hello")
指令来详细说明数据并相应地更改UI,则可能会使应用程序崩溃。有些制度完全禁止这样做。在同时,在
StringVar
中设置值是非常安全的。在如果您从不使用其他线程,并且可以单独从回调中工作,那么您将永远不会遇到这个问题,并且您可能会认为
StringVar
是一个无用的开销。但是,任何严肃的工作都需要使用变量。在在正常情况下,没有理由使用
StringVar
。我不知道为什么大多数教程都会显示它。它增加了开销,但没有提供额外的价值。正如您所观察到的,您可以通过combobox对象本身直接获取和设置combobox的值。在使用
StringVar
的好处是:a)让两个小部件共享同一个变量,以便在另一个小部件更改时更新一个,或者b)将一个或多个跟踪附加到StringVar
。这两种方法都不常见,但有时非常有用。在相关问题 更多 >
编程相关推荐