在 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
,但为什么呢? 看起来完全没有意义。
由于 Python 没有类型安全性,因此您将使用字符串覆盖对
StringVar
对象的引用。要设置该值,请调用 set
方法:
test = StringVar()
country = ttk.Combobox(master, textvariable=test)
#...
test.set("hello")
正常情况下没有理由使用
StringVar
。我不知道为什么大多数教程都会显示它。它增加了开销,但没有提供额外的价值。正如您所观察到的,您可以通过组合框对象本身直接获取和设置组合框的值。
使用
StringVar
的优点在于,当您想要 a) 让两个小部件共享相同的变量,以便在另一个小部件更改时更新另一个小部件,或者 b) 将一个或多个跟踪附加到 StringVar
时。这两者都不常见,但有时非常有用。
正如 Squall 指出的,要更改
StringVar
值,您需要使用其 set()
方法。
另一方面,Tk 变量的目的是跟踪它们所连接的小部件的值。您应该更喜欢使用
StringVar
而不是直接读取小部件的值的原因是后者是 线程安全。
线程安全对于 tkinter 来说是一个有点棘手的话题,但从技术上讲,你不应该被允许在与创建窗口的线程不同的线程中修改 GUI 元素(即原始线程被阻塞在
mainloop()
plus 中)您定义的回调)。
如果您有一个额外的后台线程来详细说明数据并使用
country.set("hello")
指令相应地更改 UI,则可能会导致您的应用程序崩溃。有些系统完全禁止这样做。
同时,在
StringVar
中设置值是完全安全的。
如果您从不使用其他线程并且可以仅通过回调工作,那么您将永远不会遇到此问题,并且您可能会认为
StringVar
是无用的开销。但是,您将需要使用变量来完成任何类型的严肃工作。
这是我第一次尝试这种方法,我发现自己也在这里。 哈哈,我很好奇为什么我必须这样做。我同意 .set 方法在代码块中工作得更好。它在审美上令人愉悦。这就是合理的默认值。
我尝试了上面的代码都失败了。语言弃用?
import tkinter as tk
from tkinter import ttk
master = tk.Tk()
country = ttk.Combobox(master)
country['values'] = ('USA', 'Canada', 'Australia')
country.pack()
country.set("hello")
master.mainloop()
链接到组合框当前值的变量;当变量更改时,组合框的当前值将更新