今天我正在学习英语,遇到了一些奇怪的事情,谁能帮助我?这是我的第一个代码:
from tkinter import *
def click_me():
count += 1
print(f'You press {count} times button!')
root = Tk()
count = 0
Button(root, text='click me', command=click_me).pack()
root.mainloop()
我运行这段代码得到info:local variable 'count' referenced before assignment
我可以理解,因为当我学习python时,他们告诉我我需要使用global
或click_me(count)
来完成这项工作。
这是我的第二个代码:
from tkinter import *
def select():
print(f'Checkbutton value is {str(var.get())}')
root = Tk()
var = IntVar() # return bool value into 1 or 0.
Checkbutton(root, text='click me', variable=var, command=select).pack()
root.mainloop()
我可以运行第二个代码没有任何错误。所以我认为count
和var
都是变量,不同的是一个是常规变量,另一个是kinker变量,是这样吗?
在Python中,默认,你只能分配最内层作用域中的变量. 当你count += 1
(count = count + 1
几乎一样)你分配count
,所以Python将它视为一个局部变量。正因为如此,当你试图计算count + 1
的值时,你得到的是UnboundLocalError
。
考虑以下内容:
from tkinter import *
def click_me():
print(f'You press {count + 1} times button!')
root = Tk()
count = 0
Button(root, text='click me', command=click_me).pack()
root.mainloop()
这段代码可以工作,因为您只访问count的值,而不在函数内对其赋值。因此,当在局部作用域中找不到它时,Python会在外围作用域中搜索它。
现在,以var
from tkinter import *
def select():
print(f'Checkbutton value is {str(var.get())}')
root = Tk()
var = IntVar() # return bool value into 1 or 0.
Checkbutton(root, text='click me', variable=var, command=select).pack()
root.mainloop()
这里,你也没有赋值给var,所以它不会被标记为local。现在,让我们添加看似没有意义的代码行:var = var
def select():
var = var
print(f'Checkbutton value is {str(var.get())}')
这将给我们提供与count
完全相同的错误-由于对var
赋值,它被视为局部变量,因此在尝试访问其值时将得到错误。