如何通过搜索栏获取MDCard数据并转移至不同MDScreen的MDCard
问题解决:KivyMD搜索并转移MDCard内容
问题背景
在.kv文件的searched_list中包含100余个MD3Card,需要实现搜索功能:通过搜索栏输入关键词,找到匹配的卡片,并将这些卡片的内容复制到search_results页面的search_list中,但现有函数无法正常运行。
原有代码的问题
- 直接给
self.ids.search_list赋值字符串是错误操作,search_list是MDList组件,需通过添加子组件来展示内容 - 未遍历
searched_list中的所有卡片进行关键词匹配 clear_results函数仅清空搜索框,未清理search_list中的历史结果
修正后的实现代码
Python类代码(AllGimsScreen)
from kivymd.uix.screen import MDScreen from Screens.AllGimsScreen.components.card import MD3Card class AllGimsScreen(MDScreen): def searching(self, search_text): if not search_text.strip(): return # 清空旧搜索结果 self.clear_search_list() # 设置搜索标签并切换页面 self.ids.search_label.text = search_text self.ids.screen_manager.current = "search_results" # 遍历源卡片列表,匹配关键词 for card in self.ids.searched_list.children: # 不区分大小写匹配卡片文本 if search_text.lower() in card.text.lower(): # 复制原卡片属性创建新卡片 new_card = MD3Card() new_card.source = card.source new_card.text = card.text # 添加到搜索结果列表 self.ids.search_list.add_widget(new_card) def clear_results(self): # 同时清空搜索框和结果列表 self.ids.search_field.text = "" self.clear_search_list() def clear_search_list(self): # 封装清空结果列表的逻辑 self.ids.search_list.clear_widgets()
kv文件可选优化
若希望列表自适应行列数量,可将searched_list和search_list的固定cols/rows改为自适应属性,避免固定行数导致的布局溢出:
MDList: id: searched_list adaptive_col: True adaptive_row: True spacing: "18dp" padding: "24dp" # 搜索结果页面的MDList同理 MDList: id: search_list adaptive_col: True adaptive_row: True spacing: "18dp" padding: "24dp"
代码说明
searching函数:先清空旧结果,遍历源卡片列表完成关键词匹配,复制匹配卡片的属性创建新组件并添加到结果列表clear_results函数:同时完成搜索框清空和结果列表清理clear_search_list函数:封装结果列表清空逻辑,避免代码重复
内容的提问来源于stack exchange,提问作者R1SH
相关产品推荐
相关产品推荐

