所以,我正在尝试创建一种计算器。我测试了我在新文件上创建的代码,它可以工作。但现在,当我将代码放在我的程序文件中时,会出现此错误。
v1 = v1.get()
NameError: global name 'v1' is not defined
这是我的代码:
def calc_price():
cp = Tk()
cp.title("Calcular Preço")
def plus():
global v1
global v2
global r
v1 = v1.get()
v2 = v2.get()
v1 = float(v1)
v2 = float(v2)
r.set(v1 + v2)
r = StringVar()
r.set(0)
Label(cp, textvariable = r).pack()
calc_b = Button(cp, text = "Calcular", command = plus).pack(padx = 5, pady = 5)
v1 = Entry(cp)
v1.pack()
v2 = Entry(cp)
v2.pack()
我说我已经在一个文件上测试了它并且它有效,所以我不知道错误在哪里,所以我需要你的帮助。谢谢。
编辑: 现在错误消失了,但标签没有显示结果。我想我发现了这个问题。当代码在函数calc_price中时,标签不显示结果。当代码在新文件中时,标签有效......
答案 0 :(得分:1)
您将v1
,v2
和r
标记为 globals ,但未定义此类全局变量。
calc_price()
(不在嵌套plus
)中具有相同名称的变量是不是全局变量。它们是该函数中的本地名称。您必须将它们标记为该范围级别的全局 。
然而,您将使用.get()
调用的结果替换这些变量;这不是你想要的东西。
删除 global
个关键字,然后使用不同的文件名存储.get()
个结果:
def calc_price():
cp = Tk()
cp.title("Calcular Preço")
def plus():
v1result = v1.get()
v2result = v2.get()
v1result = float(v1result)
v2result = float(v2result)
r.set(v1result + v2result)
r = StringVar()
r.set(0)
Label(cp, textvariable = r).pack()
calc_b = Button(cp, text = "Calcular", command = plus).pack(padx = 5, pady = 5)
v1 = Entry(cp)
v1.pack()
v2 = Entry(cp)
v2.pack()
现在代码按预期工作:
如果不分配给v1
和v2
,Python会在周围范围内查找它们的定义,并在calc_price
中找到变量。