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

如何在Kivy Python的MDDataTable中为row_data实现RecycleView

问题根因

点击全选崩溃不是你代码逻辑的问题,是旧版KivyMD的MDDataTable没有基于RecycleView实现行渲染,全选时会一次性实例化所有行的复选框组件,触发渲染栈溢出导致的。不需要你手动单独为row_data实现RecycleView,新版MDDataTable已经内置了基于RecycleView的行渲染逻辑,只要正确配置即可解决。

操作步骤
  • 先升级本地KivyMD到最新稳定版,0.104及更早的版本没有内置RecycleView支持,50行数据全选必崩,推荐使用KivyMD 1.2.0搭配Kivy 2.1.0的稳定组合。
  • 初始化MDDataTable时显式添加use_pagination=False参数,强制组件走RecycleView模式一次性渲染所有行,避免内部默认分页逻辑和全选功能的冲突。
  • 不要把列表推导式生成的行数据直接作为参数传入MDDataTable,先赋值给独立变量再传参,避免临时对象被弱引用回收导致遍历行数据时触发空指针崩溃。
修复后完整代码
from kivy.metrics import dp
from kivy.uix.anchorlayout import AnchorLayout

from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable


class Example(MDApp):
    def build(self):
        layout = AnchorLayout()
        # 提前定义行数据,避免临时生成对象导致的引用异常
        table_row_data = [
            (f"{i + 1}", "1", "2", "3", "4", "5") for i in range(50)
        ]
        data_tables = MDDataTable(
            size_hint=(0.9, 0.6),
            background_color=(1, .1, 1, 1),
            check=True,
            rows_num=50,
            use_pagination=False,  # 关闭分页,启用内置RecycleView全量渲染
            column_data=[
                ("No.", dp(30)),
                ("Column 1", dp(30)),
                ("Column 2", dp(30)),
                ("Column 3", dp(30)),
                ("Column 4", dp(30)),
                ("Column 5", dp(30)),
            ],
            row_data=table_row_data,
        )
        layout.add_widget(data_tables)
        return layout


Example().run()
补充说明
  • 修复后点击全选不会再崩溃,需要获取选中行数据直接调用data_tables.get_row_checks()即可,不需要自己额外绑定全选事件。
  • 如果后续数据量超过100行,建议开启分页,把rows_num设置为单页展示的行数(比如20),RecycleView只会渲染当前可视区域内的行组件,滚动和全选的性能会更好。
  • 如果升级版本后仍有异常,检查是否存在多个版本KivyMD共存的情况,卸载旧版本后重新安装即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:54:27