为什么可以在函数中使用tkinter变量,而不需要输入常规变量



今天我正在学习英语,遇到了一些奇怪的事情,谁能帮助我?这是我的第一个代码:

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时,他们告诉我我需要使用globalclick_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()

我可以运行第二个代码没有任何错误。所以我认为countvar都是变量,不同的是一个是常规变量,另一个是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赋值,它被视为局部变量,因此在尝试访问其值时将得到错误。

相关内容

  • 没有找到相关文章

最新更新