Python tkinter:在组合框中使用“文本变量”似乎没用

问题描述 投票:0回答:5

在 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 combobox tkinter
5个回答
7
投票

由于 Python 没有类型安全性,因此您将使用字符串覆盖对

StringVar
对象的引用。要设置该值,请调用
set
方法:

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

6
投票

正常情况下没有理由使用

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

使用

StringVar
的优点在于,当您想要 a) 让两个小部件共享相同的变量,以便在另一个小部件更改时更新另一个小部件,或者 b) 将一个或多个跟踪附加到
StringVar
时。这两者都不常见,但有时非常有用。


2
投票

正如 Squall 指出的,要更改

StringVar
值,您需要使用其
set()
方法。

另一方面,Tk 变量的目的是跟踪它们所连接的小部件的值。您应该更喜欢使用

StringVar
而不是直接读取小部件的值的原因是后者是 线程安全

线程安全对于 tkinter 来说是一个有点棘手的话题,但从技术上讲,你不应该被允许在与创建窗口的线程不同的线程中修改 GUI 元素(即原始线程被阻塞在

mainloop()
plus 中)您定义的回调)。

如果您有一个额外的后台线程来详细说明数据并使用

country.set("hello")
指令相应地更改 UI,则可能会导致您的应用程序崩溃。有些系统完全禁止这样做。

同时,在

StringVar
中设置值是完全安全的。

如果您从不使用其他线程并且可以仅通过回调工作,那么您将永远不会遇到此问题,并且您可能会认为

StringVar
是无用的开销。但是,您将需要使用变量来完成任何类型的严肃工作。


0
投票

这是我第一次尝试这种方法,我发现自己也在这里。 哈哈,我很好奇为什么我必须这样做。我同意 .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()

0
投票

链接到组合框当前值的变量;当变量更改时,组合框的当前值将更新

© www.soinside.com 2019 - 2024. All rights reserved.