在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()
这确实有效。
from Tkinter import *
import ttk
master = Tk()
country = ttk.Combobox(master)
country['values'] = ('USA', 'Canada', 'Australia')
country.pack()
# This does set a default value.
country.set("hello")
mainloop()
如果您只想使用.set
和.get
方法,那么为textvariable
分配任何内容有什么意义?在线的每个示例似乎都使用textvariable
,但为什么?这似乎毫无意义。
答案 0 :(得分:2)
在正常情况下没有理由使用StringVar
。我不知道为什么大多数教程都会显示它。它增加了开销,但没有提供额外的价值。如您所见,您可以通过组合框对象本身直接获取和设置组合框的值。
使用StringVar
的优势在于:a)有两个小部件共享同一个变量,以便在另一个更改时更新一个,或者b)将一个或多个跟踪附加到{ {1}}。这两种都不常见,但有时非常有用。
答案 1 :(得分:1)
由于Python没有类型安全性,因此您将使用字符串覆盖对StringVar
对象的引用。要设置值,请调用set
方法:
test = StringVar()
country = ttk.Combobox(master, textvariable=test)
#...
test.set("hello")
答案 2 :(得分:1)
如Squall所指出的,要更改StringVar
值,您需要使用其set()
方法。
另一方面,Tk变量的目的是跟踪它们所连接的小部件的值。比起直接读取小部件的值,您更喜欢使用StringVar
的原因是,后者是线程安全的。
线程安全对于tkinter来说是一个棘手的话题,但是从技术上讲,您不应该被允许在与创建窗口不同的线程中对GUI元素进行修改(即,原始线程在{{1}中被阻塞) } 加上您定义的回调)。
如果您有一个额外的后台线程来详细说明数据并使用mainloop()
指令相应地更改UI,则可能会使您的应用程序崩溃。一些系统完全禁止这样做。
同时,在country.set("hello")
中设置值是绝对安全的。
如果您从不使用其他线程并且可以单独通过回调工作,那么您将永远不会遇到这个问题,并且您可能认为StringVar
是无用的开销。但是,您将需要使用变量进行任何形式的认真工作。