错误NameError:未定义全局名称“v1”

时间:2015-03-14 18:17:26

标签: python tkinter

所以,我正在尝试创建一种计算器。我测试了我在新文件上创建的代码,它可以工作。但现在,当我将代码放在我的程序文件中时,会出现此错误。

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中时,标签不显示结果。当代码在新文件中时,标签有效......

1 个答案:

答案 0 :(得分:1)

您将v1v2r标记为 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()

现在代码按预期工作:

  

Tkinter calculator window

如果不分配给v1v2,Python会在周围范围内查找它们的定义,并在calc_price中找到变量。