【问题标题】:what is the difference between a variable and StringVar() of tkintertkinter的变量和StringVar()有什么区别
【发布时间】:2018-08-10 09:55:22
【问题描述】:

代码:

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 报错?

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案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()

    希望这能回答您的问题!

    【讨论】:

    • 我喜欢这个答案!。我明白了 directly 更改 Label 小部件的文本与使用 StringVar 的区别,谢谢!这也适用于其他人,对吗?喜欢IntVar?和其他人?
    【解决方案2】:

    StringVar() 是来自 tkinter 的一个类。使用它是为了让您可以轻松地监控 tkinter 变量的更改(如果它们通过提供的示例代码发生):

    def callback(*args):
        print "variable changed!"
    
    var = StringVar()
    var.trace("w", callback)
    var.set("hello")
    

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

    "hello"这样的字符串只是一种数据类型,它可以被操作和读取等等,主要的区别是如果字符串被赋值给一个变量,比如a = 'hello',就没有办法了告诉a 是否发生了变化(即现在a = 'hello'),除非你在某个地方进行比较可能会很混乱。

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

    有帮助:http://effbot.org/tkinterbook/variable.htm

    编辑:根据@Bryan Oakley's 的建议,将“变量”替换为“tkinter 变量”

    【讨论】:

    • 我认为如果您使用“tkinter variables”之类的东西而不是“variables”,您的答案会更好。您不能使用StringVar 来监视普通变量的变化,但是您的回答听起来像是可以的。否则,这是一个很好的答案。
    【解决方案3】:

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

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

    【讨论】:

    • 我是 Python 新手。所以,如果你能用一个例子来解释你的观点,那就太好了。这样我可以很快理解。
    【解决方案4】:

    开头添加

    root = tk.Tk()

    这些变量是为 tkinter 设计的。而且这些都不能独立工作。

    【讨论】:

    • 我认为,OP 的意思是 StringVar() 而不是普通变量和 Tk() 实例
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2018-04-23
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多