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

KivyMD待办应用点击MDCard仅删除最后一项,求正确点击删除函数代码

解决方案

问题原因

  • 循环生成卡片时反复给self.card、self.layout赋值,最终这两个实例属性仅指向最后生成的卡片和布局,导致删除操作永远作用在最后一张卡片上
  • 原代码中每个卡片单独嵌套一层GridLayout属于冗余布局,会额外增加组件层级复杂度

修正后代码

def on_start(self):
    # 提前创建公共布局,不要放在循环内重复生成
    self.task_layout = GridLayout(cols=1, padding=10, size_hint_y=None)
    self.root.ids.text_area.add_widget(self.task_layout)
    
    content_task = []
    content_time = []
    try:
        # 用with语句自动管理文件关闭,避免资源泄漏
        with open('task.txt', 'r', encoding='utf-8') as f:
            content_task = f.readlines()
        with open('time.txt', 'r', encoding='utf-8') as f:
            content_time = f.readlines()
    except:
        print('create a file')

    try:
        self.num_of_task = len(content_task)
        global Y
        for i in range(self.num_of_task):
            my_text = content_task[i].strip()
            tame = content_time[i].strip()
            
            lab = MDLabel(text=my_text)
            lab1 = MDLabel(text=tame, halign='right', font_size="10dp")
            ico = MDIconButton(icon='C:/Users/HP/Desktop/kivy/images/pink.png', on_press=self.click)

            card = MDCard(
                orientation='horizontal',
                pos_hint={'center_x': X, 'center_y': Y},
                size_hint=(.9, .5),
                radius=[15, 15, 15, 15],
                padding=('15dp', "30dp", "15dp", "15dp"),
                md_bg_color=(8/255, 32/255, 50/255, 1)
            )

            card.add_widget(ico)
            card.add_widget(lab)
            card.add_widget(lab1)
            self.task_layout.add_widget(card)
    except:
        print('Error')

    self.root.ids.lb1.text = f'{len(content_task)}\nTasks'

def click(self, btn):
    # 点击的图标按钮的父组件就是目标卡片
    target_card = btn.parent
    # 从布局中移除指定卡片
    self.task_layout.remove_widget(target_card)
    # 同步更新任务计数
    current_task_count = len(self.task_layout.children)
    self.root.ids.lb1.text = f'{current_task_count}\nTasks'

额外说明

如果需要删除卡片后同步更新本地txt文件的内容,可以在click函数中补充逻辑:遍历当前self.task_layout的所有子卡片,取出任务文本和时间后重新写入两个txt文件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:24:05