如何修复Python Kivy列表中<NumericProperty name=>显示异常问题
问题根因
你在testApp类定义阶段就将numberx、numbery两个属性放入列表,此时这两个变量是NumericProperty类的属性对象,还未绑定到App实例,不会返回你设置的默认数值,所以遍历时输出的是属性对象本身的字符串形式。同时on_parent事件会触发两次,最终你会看到4行重复的属性对象输出。
修复方案
1. 调整Python代码
将列表构造逻辑移动到App实例初始化完成后的build方法中,此时读取的是实例属性的实际数值:
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.properties import NumericProperty class Test(BoxLayout): pass class TestApp(App): numberx = NumericProperty(10) numbery = NumericProperty(5) def build(self): # 实例化完成后再构造列表,此时取到的是实际数值 self.list = [self.numberx, self.numbery] return Test() if __name__ == "__main__": TestApp().run()
2. 调整KV代码
将on_parent事件替换为仅触发一次的on_kv_post事件,同时增加判断避免重复添加控件:
#:import Label kivy.uix.label.Label Test: <Test>: orientation: 'vertical' on_kv_post: if not self.children: for x in app.list: self.add_widget(Label(text = str(x) ))
修改后运行即可得到你期望的10、5两行输出。
内容的提问来源于stack exchange,提问作者DanYTz
相关产品推荐
相关产品推荐

