繁体   English   中英

Python tkinter:在 combobox 中使用“textvariable”似乎没用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM