我试图从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()
答案 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()
通过提及全局,如果它不在全球范围内,它就会被创建。