pythontkinter:在组合框中使用“textvariable”似乎没有用

2024-09-28 17:18:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在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,但为什么呢?这似乎完全没有意义。在


Tags: 方法testimport目的master示例属性tkinter
3条回答

由于Python没有类型安全性,所以使用字符串覆盖对StringVar对象的引用。要设置该值,请调用set方法:

test = StringVar()
country = ttk.Combobox(master, textvariable=test)
#...
test.set("hello")

正如sqall指出的,要更改StringVar值,需要使用其set()方法。在

另一方面,Tk变量的目的是跟踪它们所连接的小部件的值。您应该选择使用StringVar而不是直接读取小部件的值的原因是后者是线程安全的。在

线程安全对于tkinter来说有点棘手,但从技术上讲,您不应该被允许在与创建窗口的线程不同的线程中对GUI元素进行修改(即,原始线程被阻塞在mainloop()加上您定义的回调)。在

如果您有一个额外的后台线程,该线程使用country.set("hello")指令来详细说明数据并相应地更改UI,则可能会使应用程序崩溃。有些制度完全禁止这样做。在

同时,在StringVar中设置值是非常安全的。在

如果您从不使用其他线程,并且可以单独从回调中工作,那么您将永远不会遇到这个问题,并且您可能会认为StringVar是一个无用的开销。但是,任何严肃的工作都需要使用变量。在

在正常情况下,没有理由使用StringVar。我不知道为什么大多数教程都会显示它。它增加了开销,但没有提供额外的价值。正如您所观察到的,您可以通过combobox对象本身直接获取和设置combobox的值。在

使用StringVar的好处是:a)让两个小部件共享同一个变量,以便在另一个小部件更改时更新一个,或者b)将一个或多个跟踪附加到StringVar。这两种方法都不常见,但有时非常有用。在

相关问题 更多 >