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

时间:2018-08-10 09:55:23

标签: python-3.x tkinter

代码:

import tkinter as tk
a = "hi"
print(a)
a1 = tk.StringVar()
a1.set("Hi")
print(a1)

输出:

hi ##(Output from first print function) 

AttributeError: 'NoneType' object has no attribute '_root' (Output from second print function) 

我的问题:

以上代码中的aa1和用例之间有什么区别?为什么a1出错?

5 个答案:

答案 0 :(得分:1)

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

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

var = StringVar()
var.trace("w", callback)
var.set("hello")

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

诸如"hello"之类的字符串只是一种数据类型,可以对其进行操作和读取以及进行各种排序,主要区别在于,如果该字符串被分配给诸如a = 'hello'之类的变量,除非您在可能比较混乱的地方进行比较,否则无法判断a是否已更改(即现在a = 'hello'是否已更改)。

简单地说:StringVar()可让您轻松跟踪tkinter变量,并查看它们是否已被读取,覆盖或什至存在,而仅使用典型的a = 'hello'便无法轻松完成

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

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

答案 1 :(得分:1)

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()

会有一个带有标签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()

产生一个标签,上面写着First Time,并带有一个按钮将其轻松更改为Second Time 不过,只能使用tkinter的StringVar()

才能使用普通变量来完成此操作

希望这能回答您!

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

在开头添加

root = tk.Tk()

这些变量是为tkinter设计的。并且它们不能独立工作。

答案 4 :(得分:0)

假设您正在构建一个 GUI 计算器,您希望在计算器的屏幕上显示用户输入的值。如果用户尝试添加 5 + 5,我们必须在显示中显示“5”“+”“5”。当按下等于按钮时,我们希望显示“10”。这就是 StringVar() 的使用。它持有与解释器持有的值等价的字符串。