tkinter的变量和StringVar()有什么区别

Msq*_*are 0 tkinter python-3.x

码:

import tkinter as tk
a = "hi"
print(a)
a1 = tk.StringVar()
a1.set("Hi")
print(a1)
Run Code Online (Sandbox Code Playgroud)

输出:

hi ##(Output from first print function) 

AttributeError: 'NoneType' object has no attribute '_root' (Output from second print function) 
Run Code Online (Sandbox Code Playgroud)

我的问题:

是什么区别a,并a1在上面的代码及其使用情况。为什么a1给出错误?

Max*_*Max 6

StringVar()是来自 tkinter 的一个类。使用它以便您可以通过提供的示例代码轻松监控 tkinter 变量的更改:

def callback(*args):
    print "variable changed!"

var = StringVar()
var.trace("w", callback)
var.set("hello")
Run Code Online (Sandbox Code Playgroud)

此代码将检查是否var已被覆盖(此模式由win var.trace("w", callback).

诸如此类的字符串"hello"只是一种数据类型,它可以被操作和读取以及各种类型的,主要区别在于,如果将字符串分配给变量,例如a = 'hello',则无法判断是否a已更改(即如果现在a = 'hello') 除非你在某处进行比较可能会很乱。

简而言之:StringVar()允许您轻松跟踪 tkinter 变量并查看它们是否已被读取、覆盖,或者它们是否存在,而您仅使用典型的变量就无法轻松做到这一点a = 'hello'

有用的:http : //effbot.org/tkinterbook/variable.htm

编辑:根据@Bryan Oakley 的建议,在适当的地方将“变量”替换为“ tkinter变量”


Bea*_*der 5

最常使用StringVar()快速编辑小部件的文本

例如:

import tkinter as tk


root = tk.Tk()
my_string_var = tk.StringVar()
my_string_var.set('First Time')
tk.Label(root, textvariable=my_string_var).grid()
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

将具有带有标签的First Time 注释输出:注意:textvariable在使用字符串变量时必须使用

这段代码:

import tkinter as tk

def change():
    my_string_var.set('Second Time')

root = tk.Tk()
my_string_var = tk.StringVar()
my_string_var.set('First Time')
tk.Label(root, textvariable=my_string_var).grid()
tk.Button(root, text='Change', command=change).grid(row=1)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

产生一个标签上说First Time和一个按钮,即可轻松将其更改为Second Time 这是无法和正常的变量,虽然来完成,只有Tkinter的的StringVar()

希望这能回答您!


Bry*_*ley 5

Tkinter 是嵌入式 tcl 解释器的包装器。StringVar是一个提供辅助函数的类,用于在该解释器中直接创建和访问此类变量。因此,它要求解释器存在才能创建实例。该解释器是在您创建 的实例时创建的Tk。如果您尝试在初始化 tkinter 之前创建 的实例StringVar,您将收到问题中显示的错误。

一旦 tkinter 被正确初始化并StringVar创建了一个实例,它就可以像任何其他 python 对象一样对待。它有方法来获取和设置它所代表的值。