[英]Python tkinter: Using a "textvariable" in a combobox seems useless
在 tkinter 中创建 combobox 时使用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()
阻塞的原始线程加上回调你定义的)。
如果您有一个额外的后台线程来详细说明数据并使用country.set("hello")
指令相应地更改 UI,则可能会使您的应用程序崩溃。 有些系统完全禁止这样做。
同时,在StringVar
设置值是完全安全的。
如果您从不使用其他线程并且可以单独使用回调工作,那么您将永远不会遇到这个问题,您可能会将StringVar
视为无用的开销。 但是,对于任何类型的严肃工作,您都需要使用变量。
这是我使用这种方法的第一个 go,我也发现自己在这里。 大声笑我很好奇为什么我必须这样做。 我同意 .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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.