如何将tkinter变量定义为全局变量?

时间:2016-12-27 06:44:16

标签: python tkinter

我试图从Deferred中提取一个整数,并将其存储在python变量中以用于各种函数。现在我遇到的问题是作用域之一,其中Entry在一个类中声明,而python变量在IntVar中的另一个方法中声明,调用IntVar将其存储在class A中的变量。

现在我理解为什么 class A不被视为全球性的。但是当我尝试将IntVar放在包含gui的类时,它会返回IntVar错误并引用__init__模块中的行。

我也尝试将这些函数移动到UI类,但这也很难看,因为我无法弄清楚如何从tkinter方法之外调用它们,并将它们放在其他地方导致__init__

这是一个快速而肮脏的模型,用于说明问题:

NameError: name 'xxx' is not defined

如上所述,我已经尝试过相当多的事情,在我认为可以扩大其范围的地方宣布from tkinter import * class SampleObj(object): def __init__(self, pyvar): self.pyvar = 0 def SampleFunc(self): self.pyvar = tkvar.get() self.pyvar += 1 tkvar.set(self.pyvar) Test = SampleObj(0) class MainGui: def __init__(self, master): self.master = master self.master.title("I'm a test Gui!") tkvar = IntVar() mFrame = Frame(master) mFrame.pack() self.Entry = Entry(mFrame, textvariable=tkvar) self.Entry.pack() self.Label = Label(mFrame, text=tkvar.get()) self.Label.pack() tkvar.trace("w", Test.SampleFunc()) root = Tk() my_gui = MainGui(root) root.mainloop() ,但每次都是"不是定义"或者变量未在根目录中初始化的问题(我认为这是另一个错误意味着什么)。

我现在用谷歌搜索了大约四个小时,但没有找到任何解决方案。我还咨询了其他人,我会考虑使用Python中间件(与我相比作为新手),他们不知道该告诉我什么,除了它显然是范围问题(我已经知道了) )。所以,任何帮助我指向正确方向的人都会受到赞赏。

编辑:根据要求提供回溯。

代码错误:

IntVar

当我尝试将Traceback (most recent call last): File "REDACTED", line 34, in <module> my_gui = MainGui(root) File "REDACTED", line 30, in __init__ tkvar.trace("w", Test.Magic()) File "REDACTED", line 8, in Magic self.pyvar = tkvar.get() NameError: name 'tkvar' is not defined 向上移动到所有类之外时出错:

tkvar = IntVar()

2 个答案:

答案 0 :(得分:2)

我不知道你尝试用这些变量做什么,所以我创建的例子只展示如何使用它们

import tkinter as tk


class SampleObj(object):

    def __init__(self, some_var):
        self.pyvar = some_var

    def sample_func(self, arg1, arg2, arg3):
        print(type(arg1), arg1)
        print(type(arg2), arg2)
        print(type(arg3), arg3)

        self.pyvar.set(self.pyvar.get()+1)

        print('global_var:', self.pyvar.get())


class MainGui:

    def __init__(self, master, some_object):
        self.master = master
        self.some_object = some_object

        self.master.title("I'm a test Gui!")

        frame = tk.Frame(master)
        frame.pack()

        tkvar = tk.IntVar(value=0)

        # use the same variable in entry and label
        self.entry = tk.Entry(frame, textvariable=tkvar)
        self.entry.pack()

        # use the same variable in label
        self.label = tk.Label(frame, textvariable=tkvar)
        self.label.pack()

        # execute function when variable change value 
        # but it doesn't send new value to function
        tkvar.trace("w", self.some_object.sample_func)

# --- main ---

root = tk.Tk()

# after tk.Tk()
global_var = tk.IntVar(value=0)

# use variable in class 
test = SampleObj(global_var)

MainGui(root, test)

root.mainloop()

print('END: global_var:', global_var.get())

答案 1 :(得分:-1)

就在

之前
    tkvar = IntVar()
     

使用

global tkvar; tkvar = IntVar()

通过提及全局,如果它不在全球范围内,它就会被创建。