在Python中将Stringvar变量声明为类变量

时间:2018-03-16 10:04:20

标签: python tkinter initialization class-variables

我想启动一个类变量,以便将它传递给另一个类。此变量必须是StringVar变量,因为我想将其用于Entry Tkinter函数。到目前为止我所做的是:

class ClassA:
    var1 = StringVar()
    def __init__(self,master):
        entry1 = Entry(master, textvariable = var1)

root = Tk()
my_gui = ClassA(root)
root.mainloop()

然而,它给出了消息:

  

StringVar instance has no attribute '_tk'.

这可以通过在Tk()声明之前添加StringVar来解决,但这会在我启动应用时生成一个新窗口。有没有办法在不必添加Tk()行的情况下声明它?当我在课堂外发起Tk()时,我无法弄清楚为什么会这样。

1 个答案:

答案 0 :(得分:1)

class声明下的非定义行会在到达时立即被读取,并且在var1 = StringVar()没有Tk个实例的时候会被读取,因此出错

您可以改为在类var1中的方法中分配__init__类变量。替换:

class ClassA:
    var1 = StringVar()
    def __init__(self,master):
        entry1 = Entry(master, textvariable = var1)

使用:

class ClassA:
    def __init__(self,master):
        entry1 = Entry(master)
        ClassA.var1 = StringVar()
        entry1['textvariable'] = ClassA.var1

一个完整的例子:

try:
    import tkinter as tk
except ImportError:
    import Tkinter as tk


class ClassA:
    def __init__(self, master):
        entry1 = tk.Entry(master)
        ClassA.var1 = tk.StringVar()
        entry1['textvariable'] = ClassA.var1
        ClassA.var1.set('"asd"')
        print("[Inside call], it is: {}".format(entry1.get()))


root = tk.Tk()
my_gui = ClassA(root)
print("[Outside call], it is: {}".format(ClassA.var1.get()))
tk.mainloop()