【问题标题】:UnboundLocalError local variable referenced before assignment赋值前引用的 UnboundLocalError 局部变量
【发布时间】:2013-11-29 12:28:22
【问题描述】:

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

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

这是我一直在运行的代码: 我已经尝试在函数中使 rootent 全局化,并且我尝试将它作为 para 传递,但没有运气。 (希望有一个明确的答案/解释,因为我不是一个很棒的程序员(可能不明白你的答案))

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()

【问题讨论】:

  • 虽然这与问题没有直接关系,但 tkinter 并未设计为拥有多个 Tk 实例。如果你想创建一个额外的窗口,你应该创建一个 Toplevel 的实例

标签: python-3.x tkinter


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您正试图从以前未声明的变量中get 某些东西。您的代码中声明的rootent 变量在哪里?你需要向我们展示这一点。很难猜出rootent 的类型是什么。

    【讨论】:

    • 我在我想在 def option() 中使用的“rootent”旁边放了一条评论,从底部算起第 3 行
    • 我可以看到,但是在设置为某个值之前无法引用该变量,即。字典或其他对象。在某个地方需要存在类似rootent = to_something 的东西,那么您可以使用,只有当该对象具有称为get()的函数时才能使用@
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2019-09-02
      • 1970-01-01
      • 2015-06-14
      • 2018-06-29
      • 2011-10-31
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多