Python tkinter:使用" textvariable"在一个组合框中似乎毫无用处

时间:2016-05-24 13:08:33

标签: python combobox tkinter

在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,但为什么?这似乎毫无意义。

3 个答案:

答案 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是无用的开销。但是,您将需要使用变量进行任何形式的认真工作。