tkinter全局变量作用域异常:两变量正常一变量报错求助
Tkinter全局变量作用域问题:UnboundLocalError异常分析与解决
问题核心
你在val_1函数中遇到的UnboundLocalError: local variable 'flg' referenced before assignment,本质是Python作用域规则导致的,它和另外两个变量bid、max_score的区别在于函数内是否对变量执行了赋值操作。
原因分析
Python的作用域判定逻辑很明确:
- 如果函数内只读取变量值,Python会先在局部作用域查找,找不到就去全局作用域匹配,所以
bid和max_score能正常读取全局值。 - 但如果函数内对变量进行了赋值(哪怕赋值操作在代码后半段),Python会默认这个变量是局部变量,不再去全局作用域查找。你的
val_1函数里有flg = True和flg = False的赋值操作,所以Python把flg当成了局部变量,但在函数开头的print(flg)和if flg:判断时,局部的flg还未被赋值,因此触发未绑定错误。
解决方案
在val_1函数开头,明确声明flg是全局变量,告诉Python不要将其视为局部变量:
def val_1(): global flg # 新增该行,声明使用全局作用域的flg变量 print(bid, max_score, flg) if flg : return True else: flg = True s1 = int(f1_txt.get()) s2 = max_score - s1 if s1 < bid: messagebox.showinfo("UH-OH","Looks like someone went up !!") s1 = 0-bid f1_txt.set(str(s1)) f2_txt.set(str(s2)) flg = False return True
补充说明
你在全局作用域写的global bid、global max_score、global flg是多余的——global关键字仅在函数内部使用,用来声明要引用全局变量,全局作用域本身不需要添加该声明。
内容的提问来源于stack exchange,提问作者Gene B
相关产品推荐
相关产品推荐

