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

如何在KivyMD DataTable中根据文本内容动态调整行高?

KivyMD MDDataTable实现行高随文本自动调整

MDDataTable默认行高固定,长文本会被截断或显示不全。要实现行高随内容自动调整,需要自定义单元格组件并修改表格的行高计算逻辑,具体方案如下:

完整实现代码

from kivy.metrics import dp
from kivy.uix.boxlayout import BoxLayout
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable
from kivymd.uix.label import MDLabel


class AutoWrapLabel(MDLabel):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.text_size = (self.width, None)  # 按单元格宽度自动换行
        self.size_hint_y = None  # 取消自动高度,手动计算
        self.bind(width=self.update_height)  # 宽度变化时更新高度

    def update_height(self, *args):
        self.text_size = (self.width, None)
        self.height = self.texture_size[1] + dp(8)  # 文本高度加内边距


class AutoHeightMDDataTable(MDDataTable):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.row_height = dp(24)  # 初始行高,后续自动调整

    def _get_cell_widget(self, instance_table, row_index, col_index, text):
        # 替换默认单元格为自定义自动换行标签
        cell = AutoWrapLabel(text=text, halign="left", valign="middle")
        cell.bind(height=self.update_row_height)  # 单元格高度变化时更新行高
        return cell

    def update_row_height(self, *args):
        # 计算每行最大单元格高度,设置为当前行高
        max_height = dp(24)
        for row in self._rows:
            current_row_max = max(cell.height for cell in row.children)
            if current_row_max > max_height:
                max_height = current_row_max
        self.row_height = max_height
        self._table_data.refresh_from_data()  # 刷新表格布局


class DynamicTableExample(MDApp):
    def build(self):
        layout = BoxLayout(orientation='vertical')

        table = AutoHeightMDDataTable(
            size_hint=(1, 1),
            use_pagination=True,
            check=True,
            column_data=[
                ("Header 1", dp(100)),  # 合理设置列宽,避免过度换行
                ("Header 2", dp(150)),
                ("Header 3", dp(100)),
            ],
            row_data=[
                ("This is a long text for Row 1 Data 1. " * 5, 
                 "This is a long text for without next line This is a long text for without next line This is a long text for without next line This is a long text for without next line ", 
                 "This is a long text for Row 1 Data 3"),
                ("51", "28", "387"),
                ("58", "42", "78"),
            ]
        )

        layout.add_widget(table)
        return layout

if __name__ == "__main__":
    DynamicTableExample().run()

关键逻辑说明

  1. AutoWrapLabel:自定义标签组件,通过text_size属性实现文本自动换行,绑定宽度变化事件实时计算并更新自身高度,确保能完整包裹文本内容。
  2. AutoHeightMDDataTable:重写表格的单元格创建方法,替换默认单元格为自定义标签;通过遍历所有行的单元格高度,动态设置表格的row_height为每行的最大单元格高度,最后刷新表格布局。
  3. 注意事项:需根据实际需求调整列宽,过窄的列会导致文本过度换行,行高过高;分页切换时,表格会自动重新计算行高,无需额外处理。

内容的提问来源于stack exchange,提问作者Reza Besharat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 07:35:19