Kivy中通过ids调用自定义部件方法触发AttributeError问题求助
解决Kivy中自定义部件方法调用的AttributeError问题
这个错误的根源其实很容易忽略——你在kv文件里重新定义了LabelBox类,直接覆盖了Python代码中写好的同名类,导致界面上的LabelBox实例根本没有你定义的change_first_text方法。
问题分析
当你在kv里写<LabelBox@BoxLayout>时,@符号的作用是创建一个全新的、继承自BoxLayout的LabelBox类,而不是引用你在PanelApp.py中已经定义好的LabelBox类。这就造成了一个矛盾:Python代码里的LabelBox有change_first_text方法,但界面上实际使用的是kv生成的“山寨版”LabelBox,自然会抛出AttributeError。
修复方案
只需要修改kv文件中LabelBox的定义,去掉@符号,让kv直接使用你Python代码里的类:
修改后的panel.kv中LabelBox部分:
<LabelBox> Label: id: first text: "first" Label: id: two text: "two"
其他部分的代码不需要改动。这样修改后,界面上的LabelBox实例就会是你Python代码中定义的那个类的实例,拥有change_first_text方法,点击按钮时就能正常调用了。
额外提示
- 记住这个Kivy的规则:如果Python中已经定义了自定义部件类,kv中直接写
<类名>即可,不要加@,否则会创建新类覆盖原类。 - 你按钮上的文本有个小拼写错误(
fisrt应该是first),虽然不影响功能,但可以顺手修正~
测试一下修改后的代码,点击第一个按钮,第一个Label的文本应该会成功改成按钮上的文字。
内容的提问来源于stack exchange,提问作者Elendil
相关产品推荐
相关产品推荐

