KivyMD ScrollView组件批量添加卡顿,如何实现逐个添加?
解决KivyMD批量添加ListItemWithCheckbox的卡顿问题
一次性循环添加大量ListItemWithCheckbox组件会阻塞Kivy的主线程,导致界面长时间无响应。要实现组件逐个添加、避免卡顿,需要将添加操作拆分成多个小任务,让GUI线程有时间刷新界面。
修改后的Python代码
from kivy.clock import Clock from kivy.factory import Factory from kivymd.uix.screen import MDScreen class Users(MDScreen): def __init__(self, **kwargs): super().__init__(**kwargs) self.item_generator = None self.schedule = None def on_enter(self): self.ids.topappbar.ids.label_title.font_size = "18sp" # 初始化生成器,负责逐个生成列表项 self.item_generator = self.generate_list_items(300) # 每隔0.01秒添加一个元素,可根据需求调整间隔 self.schedule = Clock.schedule_interval(self.add_next_item, 0.01) def generate_list_items(self, count): for i in range(count): item = Factory.ListItemWithCheckbox(text="[size=15]Item %d[/size]" % i) yield item def add_next_item(self, dt): try: # 获取下一个列表项并添加到MDList item = next(self.item_generator) self.ids.scroll.add_widget(item) except StopIteration: # 所有元素添加完成,取消调度任务 self.schedule.cancel() self.schedule = None self.item_generator = None
KV代码(保持原有结构即可)
<Users> MDTopAppBar: id: topappbar title: "Users" pos_hint: {"top": 1} ScrollView: MDList: id: scroll <ListItemWithCheckbox@OneLineAvatarIconListItem> MyAvatar: source: "data/logo/kivy-icon-128.png" MyCheckbox: id: check
关键说明
- 用生成器逐个创建列表项实例,避免一次性生成所有对象占用内存
- 通过
Clock.schedule_interval将添加操作拆分为多个异步任务,每次只添加一个元素,给GUI线程留足刷新时间 - 当生成器迭代完成(抛出
StopIteration),立即取消调度,避免无效调用
如果之前尝试Clock没效果,大概率是直接把整个循环放进了Clock.schedule_once里,这样还是会一次性执行所有添加操作,无法解决卡顿问题。拆分任务才是核心思路。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

