我在赋值错误之前得到了引用的局部变量,尽管我在代码的第一行就已经赋值了


from tkinter import *
i=1
def abc(): 
a=str(l2.get())
l1.insert(i,a)
i=i+1        
w=Tk()
w.geometry("500x300")
l1=Listbox(w,height=3)
l2=Entry(w)
l3=Button(w, text='insert', command=abc)
l1.grid(row=1,column=1)
l2.grid(row=2,column=1)
l3.grid(row=3,column=1)
w.mainloop()

我得到UnBoundLocalError:本地变量"I"在赋值之前被重新引用

正如注释中所指出的,要访问global变量并在函数内使用该全局引用进行赋值,您需要首先在函数块内将其声明为global。但是,如果您使用global,那么您在function块内进行的每一次分配也会影响global范围内的i

如果可以预料的话,这不是世界末日。但是,如果您想维护global作用域变量,那么您可以尝试以下代码:

from tkinter import *
i=1
def abc():
import __main__
j = __main__.i
a=str(l2.get())
l1.insert(j,a)
j = j+1
print(j)                  #tracking
w=Tk()
w.geometry("500x300")
l1=Listbox(w,height=3)
l2=Entry(w)
l3=Button(w, text='insert', command=abc)
l1.grid(row=1,column=1)
l2.grid(row=2,column=1)
l3.grid(row=3,column=1)
w.mainloop()
print(i)                    #tracking

单击insert后的结果,然后立即退出:

2
1
[Finished in 2.5s]

感谢acw1668他在评论中回答";您需要在abc((的开头添加全局i。–acw1668 1分钟前";我已经试过了,它现在起作用了。我想把他的回答标记为正确,但由于他在评论中补充了这一点,我无法将其标记为正确。在全球环境中声明已经意味着它是全球性的,就像我的老师在大学里教我的那样。我不知道为什么我必须在功能上单独引用它是全球性。

最新更新