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

KivyMD从txt文件读取内容添加到列表,解决root未定义报错问题

问题解决方法

错误原因

  • 你的加载逻辑直接写在ListsScreen类的定义层级,没有放到类的实例方法中,类未实例化时无法获取到控件引用
  • 在Screen类的内部不需要用root访问自身的子控件,root是KV文件中对根控件的全局引用,你在Python类的内部直接访问root本身就属于非法调用

修复方案

将加载列表的逻辑放到ListsScreen的on_enter方法中(该方法会在当前Screen被切换显示时自动触发,适合加载动态内容),直接通过self.ids访问当前页面下的子控件即可,修正后的代码如下:

from kivymd.uix.list import OneLineListItem
from kivy.uix.screenmanager import Screen

class ListsScreen(Screen):
    # 切换到当前页面时自动执行该方法
    def on_enter(self, *args):
        # 每次进入页面先清空原有列表,避免重复加载
        self.ids.container.clear_widgets()
        # 读取文件建议指定编码避免中文乱码
        with open('lists.txt', encoding='utf-8') as f:
            lines = f.readlines()
        for line in lines:
            # strip()去掉行尾的换行符和多余空白
            list_item = OneLineListItem(text=line.strip())
            self.ids.container.add_widget(list_item)

额外注意事项

  • 要确保你的KV文件中,ListsScreen对应的节点下确实存在id为container的列表容器控件
  • 如果需要页面初始化时就加载一次,也可以把逻辑写到__init__方法中,但要注意__init__执行时KV的ids还未绑定,需要加Clock.schedule_once延迟执行,示例如下:
from kivy.clock import Clock

class ListsScreen(Screen):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # 延迟1帧执行,等ids绑定完成后再加载
        Clock.schedule_once(self.load_list, 0)
    
    def load_list(self, dt):
        with open('lists.txt', encoding='utf-8') as f:
            lines = f.readlines()
        for line in lines:
            self.ids.container.add_widget(OneLineListItem(text=line.strip()))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:15:02