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

KivyMD任务管理App出现AttributeError: 'super'无__getattr__属性问题求助

解决KivyMD任务管理App中的AttributeError问题

常见触发原因

  • KV语言属性访问错误:在KV文件中误将字典当作Kivy属性访问(比如用root.task_dict.subtask而非root.task_dict['subtask']),Kivy的属性系统会通过__getattr__查找不存在的属性,从而抛出该异常。
  • 字典初始化不规范:如果关联任务与子任务的字典未在Widget的__init__中正确初始化,或被意外覆盖为非字典类型,访问时会触发错误。
  • __getattr__方法重写不当:自定义Widget类中重写__getattr__时,未在无法处理属性时调用父类的对应方法。

具体修复方案

  1. 修正KV文件中的字典访问语法
    确保用方括号访问字典元素,而非属性点语法:

    # 错误写法
    MDLabel:
        text: root.task_subtasks.subtask1
    # 正确写法
    MDLabel:
        text: root.task_subtasks['subtask1']
    
  2. 正确初始化关联字典
    在Python代码的Widget子类__init__方法中初始化字典,避免使用Kivy属性包裹普通字典(除非需要监听字典变化):

    from kivymd.uix.screen import MDScreen
    
    class TaskManagerScreen(MDScreen):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            # 初始化任务-子任务关联字典
            self.task_subtasks = {}
    
        def add_task(self, task_id):
            if task_id not in self.task_subtasks:
                self.task_subtasks[task_id] = []
    
        def add_subtask(self, task_id, subtask_content):
            if task_id in self.task_subtasks:
                self.task_subtasks[task_id].append(subtask_content)
    
  3. 规范__getattr__方法重写
    如果自定义类必须重写__getattr__,需在无法处理属性时调用父类方法:

    def __getattr__(self, name):
        if name == "custom_task_prop":
            return self._custom_value
        # 交给父类处理未定义的属性
        return super().__getattr__(name)
    
  4. 添加类型校验
    在操作字典前校验类型,避免意外赋值导致的类型错误:

    def add_subtask(self, task_id, subtask_content):
        assert isinstance(self.task_subtasks, dict), "task_subtasks必须为字典类型"
        if task_id in self.task_subtasks:
            self.task_subtasks[task_id].append(subtask_content)
    

额外排查建议

  • 打印报错时的完整调用栈,定位触发错误的具体代码行。
  • 逐步简化代码,移除非核心功能,定位到触发错误的逻辑模块。

内容的提问来源于stack exchange,提问作者She-Codes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:11:02