Kivy自定义类传参报错AttributeError,求解决方案
解决Kivy自定义Widget报错AttributeError: 'Mission' object has no attribute 'label_text'
问题原因
你遇到的错误是因为自定义的Mission Widget没有预先声明label_text属性。Kivy中,当你在kv语言里给Widget设置自定义属性并尝试引用时,必须先让该Widget类拥有对应属性,否则Python会因找不到属性抛出错误。
解决方案
有两种可行的解决方式,推荐第二种,更利于后续代码扩展:
方案1:在Python代码中定义Mission类并声明属性
修改你的main.py,添加Mission类并通过StringProperty声明label_text属性:
from kivy.app import App from kivy.lang import Builder from kivy.core.window import Window from kivy.uix.screenmanager import Screen, ScreenManager, NoTransition from kivy.uix.widget import Widget from kivy.properties import StringProperty # 导入属性类 Builder.load_file('minimal.kv') Window.size = (250,450) class HomeScreen(Screen) : pass # 自定义Mission类,声明label_text属性 class Mission(Widget): label_text = StringProperty('') # 默认值为空字符串 screen_manager = ScreenManager(transition=NoTransition()) screen_manager.add_widget(HomeScreen(name ="home_screen")) class MyMinApp(App): def build(self): Window.clearcolor = (1,1,1,1) return screen_manager if __name__ == '__main__' : MyMinApp().run()
然后修改minimal.kv,将<Mission@Widget>改为<Mission>(因为已在Python中定义类):
<HomeScreen> BoxLayout: orientation: 'vertical' Mission: label_text : 'text1' <Mission> Label: id: label_widget text: root.label_text
方案2:直接在kv文件中声明属性
如果你不想修改Python代码,可以在kv中导入StringProperty并为Mission声明属性:
#:import StringProperty kivy.properties.StringProperty <HomeScreen> BoxLayout: orientation: 'vertical' Mission: label_text : 'text1' <Mission@Widget>: label_text: StringProperty('') Label: id: label_widget text: root.label_text
原理说明
Kivy的Property类(如StringProperty)会自动处理属性的绑定逻辑,当你在kv中给Mission实例设置label_text值时,属性会被正确识别,Label的text属性也能通过root.label_text正确绑定到该值。
内容的提问来源于stack exchange,提问作者Maximilien André
相关产品推荐
相关产品推荐

