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
相关产品推荐
相关产品推荐

