You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy报错AttributeError: 'NoneType'对象无'ids'属性,求解原因

问题原因及解决方法

错误根源

  1. self.root为None:你的main.kv仅定义了<MyLayout>的类样式规则,没有实际创建该布局的实例,导致Builder.load_file("main.kv")返回None,最终self.root是None,访问self.root.ids自然触发AttributeError。
  2. 属性绑定无效:你在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:

关键修改点

  1. 在MyLayout类中添加ObjectProperty,用于接收kv中MDList的引用。
  2. 在kv文件末尾添加MyLayout:,创建布局实例,确保self.root不为None。
  3. 在kv的MyLayout规则中添加绑定语句,将内部MDList的id关联到MyLayout的属性。
  4. 修改on_start方法中访问列表的方式,通过self.root.lst_matches操作部件。

内容的提问来源于stack exchange,提问作者Davidian1980

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:30:21