Kivy报错AttributeError: 'NoneType'对象无'ids'属性,求解原因
问题原因及解决方法
错误根源
self.root为None:你的main.kv仅定义了<MyLayout>的类样式规则,没有实际创建该布局的实例,导致Builder.load_file("main.kv")返回None,最终self.root是None,访问self.root.ids自然触发AttributeError。- 属性绑定无效:你在
Example(App类)中定义的lst_matches = ObjectProperty(None)无法和kv中的部件关联——Kivy的属性绑定仅适用于Widget类,App类不属于Widget,无法直接通过kv绑定部件。
修改后的完整代码
main.py
from kivy.lang import Builder from kivy.properties import ObjectProperty from kivy.uix.boxlayout import BoxLayout from kivymd.app import MDApp from kivymd.uix.list import OneLineListItem, MDList class MyLayout(BoxLayout): lst_matches = ObjectProperty(None) # 新增属性,用于绑定kv中的MDList class Example(MDApp): def on_start(self): # 通过MyLayout的绑定属性操作列表 for i in range(20): self.root.lst_matches.add_widget(OneLineListItem(text=f"Single-line item {i}")) def build(self): self.theme_cls.theme_style = "Light" return Builder.load_file("main.kv") Example().run()
main.kv
#:kivy 2.1.0 <MyLayout>: lst_matches: lst_matches # 将内部MDList的id绑定到MyLayout的同名属性 BoxLayout: orientation: 'vertical' ScrollView: halign: 'center' size_hint_y: 0.5 size_hint_x: 0.5 MDList: id: lst_matches # 实例化MyLayout作为App的根部件 MyLayout:
关键修改点
- 在
MyLayout类中添加ObjectProperty,用于接收kv中MDList的引用。 - 在kv文件末尾添加
MyLayout:,创建布局实例,确保self.root不为None。 - 在kv的
MyLayout规则中添加绑定语句,将内部MDList的id关联到MyLayout的属性。 - 修改
on_start方法中访问列表的方式,通过self.root.lst_matches操作部件。
内容的提问来源于stack exchange,提问作者Davidian1980
相关产品推荐
相关产品推荐

