在赋值之前引用的UnboundLocalError局部变量

时间:2013-11-15 23:32:15

标签: python-3.x tkinter

到目前为止,每次运行此代码时,都会收到此错误:

Error message: 'UnboundLocalError: local variable 'rootent' referenced before assignment'

这是我一直在运行的代码: 我已经尝试过在功能上做出全面的全局性,并且我已经尝试将它作为一个没有运气的段落传递。 (更喜欢明确的答案/解释,因为我不是那么优秀的程序员(可能不理解你的答案))

class calculator():
    def __init__(self):
        def options():
            fetch=float(rootent.get()) #Location of error
            if fetch=='1':
                def IEntry():
                    fetch=float(rootent.get())
                    fetch1=float(rootent1.get())
                    answer=fetch,'+',fetch1,'=',fetch1+fetch2
                    ansLabel=Label(root,text=answer).pack()
                root=Tk()
                root.title('Addition')
                root.geometry('450x450+200+200')
                rootlabel=Label(root,text='Enter first number').pack()
                rootent=Entry()
                rootent.pack()
                rootlabel1=Label(root,text='Enter second number').pack()
                rootent1=Entry()
                rootent1.pack()
                return
        root=Tk()
        root.title('Calculator Menu')
        root.geometry('450x450+200+200')
        rootlabel=Label(root,text='1.Addition').pack()
        rootlabel1=Label(root,text='2.Subtraction').pack()
        rootlabel2=Label(root,text='3.Multiplication').pack()
        rootlabel3=Label(root,text='4.Division').pack()
        rootent=Entry(root) #This is what i am trying to input into 'def options()'
        rootent.pack()
        rootbutton=Button(root,text='Enter option',command=options).pack()

3 个答案:

答案 0 :(得分:1)

问题是python的范围规则有点奇怪。如果函数具有对变量的赋值,则该变量假定为函数的本地变量,并且python不会查看封闭的范围。在您的情况下,违规行为rootent=Entry()。您对rootent.get()的调用是在分配之前尝试访问此有意义的变量。因为你在python 3.x中,你可以使用nonlocal声明来使python访问外部作用域。只需将nonlocal rootent放在options()的开头,我认为它将正常工作。

在这里有更多关于使用非本地运算符的讨论:Python nonlocal statement

基本上,global告诉python有问题的变量名称位于模块(文件)级别。 nonlocal告诉python搜索命名变量的封闭范围并使用该版本,这更像是在其他语言中你必须明确声明所有变量的“默认”行为。

答案 1 :(得分:0)

您正尝试从先前未声明过的变量中get。代码中声明的rootent变量在哪里?你需要告诉我们。很难猜出rootent的类型是什么。

答案 2 :(得分:-1)

感谢您的帮助,现在已修复,已添加nonlocal并将float(rootent.get())更改为rootent.get(),似乎可以解决所有问题。