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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 16:47:25