Python if语句调用变量提示未定义(已在类方法中定义)
问题根因
你遇到的报错本质是Python变量作用域规则导致的:在convert1F、convert1C等方法中直接定义的fahrenheit1、celsius1属于方法内部的局部变量,仅在当前方法执行时生效,方法执行结束后变量就会被销毁,其他方法(比如show_data)无法访问到这些局部变量,因此会抛出变量未定义的错误。
类实例的全局通用属性必须绑定到实例对象self上,才能在类的所有方法中共享访问。
解决方法
按照如下两步修改代码即可修复报错:
- 重写类的初始化方法,提前声明所有需要全局共享的标志位属性,设置默认值
- 所有读取、修改这些标志位的位置,都加上
self.前缀,明确操作的是实例属性而非局部变量
修改后的完整代码参考:
from kivymd.app import MDApp from kivymd.uix.screen import Screen from kivymd.uix.button import MDRectangleFlatButton, MDRoundFlatButton from kivymd.uix.textfield import MDTextField from kivy.lang import Builder from kivymd.uix.menu import MDDropdownMenu class DemoApp(MDApp): # 重写初始化方法,声明实例共享属性 def __init__(self, **kwargs): super().__init__(**kwargs) # 初始化所有标志位默认值 self.fahrenheit1 = False self.celsius1 = False self.fahrenheit2 = False self.celsius2 = False def show_data(self): inputFahrenheit = self.root.ids.fahrenheit.text # 读取实例属性要加self.前缀 if self.fahrenheit1 is True: Celsius_Half = float(inputFahrenheit) - 32 Celsius_Before_Round = Celsius_Half * 5/9 Celsius = round(Celsius_Before_Round , 1) # 此处可自行添加Celsius的后续处理逻辑 def convert1F(self): # 赋值实例属性要加self.前缀 self.fahrenheit1 = True self.celsius1 = False def convert1C(self): self.fahrenheit1 = False self.celsius1 = True def convert2F(self): self.fahrenheit2 = True self.celsius2 = False def convert2C(self): self.fahrenheit2 = False self.celsius2 = True def on_start(self): self.theme_cls.primary_palette = "Green" self.theme_cls.primary_hue = "A700" self.theme_cls.theme_style = "Light" def build(self): kv = Builder.load_file("test.kv") screen = Screen() return kv DemoApp().run()
内容的提问来源于stack exchange,提问作者GCIreland
相关产品推荐
相关产品推荐

