为什么KIVYMD DataTable点击顶部复选框代码崩溃,点击普通选项却正常?
MDDataTable全选复选框触发崩溃问题修复
该问题是KivyMD旧版本的原生缺陷,当你同时启用check=True(行复选框)和use_pagination=True(分页功能)时,默认全选逻辑会尝试遍历全量数据行,而分页状态下当前页仅渲染了rows_num指定数量的行,索引匹配错误直接触发崩溃。普通行选择仅操作单个已渲染行,所以不会出问题。
方案一:临时规避(无需修改源码)
如果数据量不大,直接关闭分页功能即可恢复全选正常:
将use_pagination = True改为use_pagination = False
方案二:保留分页功能,自定义全选逻辑
重写全选复选框的触发事件,仅操作当前分页可见的行,完整可运行示例代码如下:
from kivymd.app import MDApp from kivymd.uix.datatables import MDDataTable from kivy.metrics import dp class TestApp(MDApp): def build(self): # 初始化表格 self.table = MDDataTable( pos_hint={"center_x":0.5,"center_y":0.4}, size_hint=(0.9,0.5), check=True, rows_num = 7, use_pagination = True, column_data=[ ("MVC", dp(30)), ("ID", dp(15)) ], row_data = [ ("Bakers Basin", "300"), ("Bayonee", "150"), ("Camden","150"), ("Cardiff","5"), ("Delanco","3"), ("Eatontown","3"), ("Edison","3"), ("Flemington","3"), ("Freehold","3"), ("Lodi","3"), ("Newark","3"), ("North Bergen","3"), ("Oakland","3"), ("Paterson","3"), ("Rahway","3"), ("Randolph","3"), ("Rio Grande","3"), ("Salem","3"), ("South Plainfield","3"), ("Toms River","3"), ("Vineland","3"), ("Wayne","3"), ("West Deptford","3") ] ) # 自定义全选逻辑,仅操作当前分页行 def custom_select_all(instance, value): page_start = self.table.page * self.table.rows_num page_end = page_start + self.table.rows_num for row in self.table.row_data[page_start:page_end]: if value: self.table.select_row(row) else: self.table.deselect_row(row) # 替换默认全选事件 self.table.header.check_box.bind(active=custom_select_all) return self.table TestApp().run()
内容的提问来源于stack exchange,提问作者Contagious
相关产品推荐
相关产品推荐

