Kivy中通过按钮递增变量值出现UnboundLocalError问题求助
解决Kivy点击按钮递增变量时的UnboundLocalError问题
嗨,咱们先搞清楚你遇到的这个错误:UnboundLocalError: local variable 'x' referenced before assignment。问题出在Python的变量作用域规则上——当你在x_changer()方法里写x = x的时候,Python会自动把x认定为这个函数的局部变量,但你在给它赋值之前就先引用了它,这就导致了“引用未赋值的局部变量”的错误。
下面给你两种解决方案,更推荐第二种,因为它更符合面向对象的设计思路,也能避免全局变量带来的潜在问题:
方案一:用global关键字声明全局变量
如果你坚持要用全局变量x,那必须在x_changer()方法内部明确告诉Python:“这个x是全局作用域里的那个变量”,具体修改如下:
修改你的.py代码:
x = 1 # 全局变量定义 class TypeOfGeometryScr(Screen): pass class SelectDemensionsScr(Screen): def submit_dn(self): global dn dn = self.ids.demensions.text class InputValuesScr(Screen): def x_changer(self): global x # 声明x为全局变量 x += 1 # 直接递增,不需要冗余的x = x这行 self.ids.xval.text = 'Please, input value of x' + str(x)
方案二:把x作为类的实例属性(更推荐)
全局变量在复杂的Kivy应用里很容易引发难以追踪的问题,更好的做法是把x绑定到InputValuesScr这个屏幕类的实例上,当作它的属性来使用:
修改后的.py代码:
class TypeOfGeometryScr(Screen): pass class SelectDemensionsScr(Screen): def submit_dn(self): global dn dn = self.ids.demensions.text class InputValuesScr(Screen): def __init__(self, **kwargs): super().__init__(**kwargs) self.x = 1 # 初始化类的实例属性x def x_changer(self): self.x += 1 self.ids.xval.text = 'Please, input value of x' + str(self.x)
另外,顺便给你提个小优化:你kv文件里TextInput的on_touch_down事件会在每次触摸时清空文本,用户不小心点到就会丢失输入内容,改成on_focus事件会更友好——只有当输入框获取焦点时才清空提示文本:
<InputValuesScr>: GridLayout: rows:2 TextInput: input_filter: 'float' font_size: 50 text: 'Please, input value of x1' id: xval multiline: False on_focus: if self.focus: self.text = '' # 获取焦点时清空 Button: text: 'Submit' on_press: root.x_changer()
这样修改后,点击Submit按钮就能正常递增x的值,并且更新输入框的文本内容啦。
内容的提问来源于stack exchange,提问作者TRZN
相关产品推荐
相关产品推荐

