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

KivyMD代码出现'Unresolved reference'错误,请求技术支持

问题分析与修复方案

你遇到的"Unresolved reference"错误主要是因为类方法引用方式错误,还有几处变量名误用和代码冗余问题,下面是具体修复步骤:

1. 修正类方法的引用方式

在load_entities_from_file方法中,你直接使用subtask_dialog和delete_entity绑定动作,但这两个是myApp类的成员方法,必须通过self来引用:

# 错误写法
item = MyListItem(icon_left_action = subtask_dialog,
                  icon_right_action = delete_entity,
                  text=entity_text[1:])

# 正确写法
item = MyListItem(icon_left_action = self.subtask_dialog,
                  icon_right_action = self.delete_entity,
                  text=entity_text[1:])

注意:绑定事件时要传递函数对象,不能加括号(加括号会直接执行函数,而非绑定动作)。

2. 修复对话框变量名错误

在subtask_dialog方法中,你错误地将对话框实例赋值给self.entity_list_dialog,应改为self.subtask_list_dialog,否则会导致self.subtask_list_dialog未初始化,调用open()时出错:

# 错误写法
self.entity_list_dialog = MDDialog(
    title="Create Subtasks",
    type="custom",
    content_cls=SubTaskDialogContent()
)

# 正确写法
self.subtask_list_dialog = MDDialog(
    title="Create Subtasks",
    type="custom",
    content_cls=SubTaskDialogContent()
)

3. 统一使用自定义的MyListItem类

在add_entity方法中,你直接创建OneLineAvatarIconListItem,没有绑定图标动作,应替换为自定义的MyListItem,保证新加条目和加载条目行为一致:

# 错误写法
item = OneLineAvatarIconListItem(
    IconLeftWidget(icon = 'plus'), IconRightWidget(icon = 'trash-can-outline'),
    text=entity_text)

# 正确写法
item = MyListItem(
    icon_left_action=self.subtask_dialog,
    icon_right_action=self.delete_entity,
    text=entity_text
)

4. 清理重复导入

代码中有多处重复导入(如MDApp和Builder),删除重复行,保留一次导入即可:

# 保留这些导入即可
from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.dialog import MDDialog
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.list import OneLineListItem, IconLeftWidget, OneLineAvatarIconListItem, IconRightWidget

完整修正后的代码

from kivymd.app import MDApp
from kivy.lang import Builder
from kivymd.uix.floatlayout import MDFloatLayout
from kivymd.uix.dialog import MDDialog
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.list import OneLineListItem, IconLeftWidget, OneLineAvatarIconListItem, IconRightWidget


class MyListItem(OneLineAvatarIconListItem):
    def __init__(self, icon_left_action, icon_right_action, **kwargs):
        super(MyListItem, self).__init__(**kwargs)

        self.icon_left = IconLeftWidget(icon='plus')
        self.icon_left.bind(on_release=icon_left_action)

        self.icon_right = IconRightWidget(icon='trash-can-outline')
        self.icon_right.bind(on_release=icon_right_action)


class EntityDialogContent(MDBoxLayout):
    def __init__(self, **kwargs):
        super(EntityDialogContent, self).__init__(**kwargs)


class SubTaskDialogContent(MDBoxLayout):
    def __init__(self, **kwargs):
        super(SubTaskDialogContent, self).__init__(**kwargs)

class myApp(MDApp):

    #Define the database and initialize the lists
    database_file = 'database.txt'
    entity_list_dialog = None
    subtask_list_dialog = None

    def build(self):
        return Builder.load_file('main.kv')

    def on_start(self):
        self.load_entities_from_file()


    def load_entities_from_file(self):
        # Creating the empty dictionary
        try:
            with open(self.database_file, "r") as file:
                lines = file.readlines()
                for line in lines:
                    entity_text = line.strip()
                    if entity_text:
                        # print("Loaded entity:", entity_text)  # Add this line for debugging
                        item = MyListItem(icon_left_action = self.subtask_dialog,
                            icon_right_action = self.delete_entity,
                            text=entity_text[1:])
                        self.root.ids.container.add_widget(item)
        except FileNotFoundError:
            print("File not found")

    # Setting the dialog boxes
    def entity_dialog(self):
        if self.entity_list_dialog:
            self.entity_list_dialog.dismiss()

        self.entity_list_dialog = MDDialog(
            title="Create Entities",
            type="custom",
            content_cls=EntityDialogContent()
        )
        self.entity_list_dialog.open()

    def subtask_dialog(self):
        if self.subtask_list_dialog:
            self.subtask_list_dialog.dismiss()

        self.subtask_list_dialog = MDDialog(
            title="Create Subtasks",
            type="custom",
            content_cls=SubTaskDialogContent()
        )
        self.subtask_list_dialog.open()

# Adding Entities and subtasks
    def add_entity(self):
        entity_text = self.entity_list_dialog.content_cls.ids.entity_text.text
        if entity_text.strip():
            with open(self.database_file, "a") as file:
                file.write("*" + entity_text + "\n")

                item = MyListItem(
                    icon_left_action=self.subtask_dialog,
                    icon_right_action=self.delete_entity,
                    text=entity_text
                )
                self.root.ids.container.add_widget(item)
                self.entity_list_dialog.content_cls.ids.entity_text.text = ""


    def add_subtask(self):
        subtask_text = self.subtask_list_dialog.content_cls.ids.subtask_text.text
        if subtask_text.strip():
            with open(self.database_file, "a") as file:
                file.write("-" + subtask_text + "\n")

                item = OneLineAvatarIconListItem(
                            # IconRightWidget(icon = 'plus'),
                            text=subtask_text)
                self.root.ids.container.add_widget(item)
                self.subtask_list_dialog.content_cls.ids.subtask_text.text = ""

#Deleting tasks and Subtasks

    def delete_entity(self):
        pass

# Closing Dialogs
    def close_entity_dialog(self, *args):
        self.entity_list_dialog.dismiss()

    def close_subtask_dialog(self):
        self.subtask_list_dialog.dismiss()

if __name__ == "__main__":
    app = myApp()
    app.run()

额外提示

  • 若需要在delete_entity方法中获取被点击的条目,可修改绑定方式,用lambda传递额外参数:
    self.icon_right.bind(on_release=lambda x: icon_right_action(self))
    
    然后在delete_entity方法中接收参数:
    def delete_entity(self, item):
        self.root.ids.container.remove_widget(item)
        # 可添加删除文件中对应内容的逻辑
    

内容的提问来源于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.06 21:16:07