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

如何让Kivymd中的MDDataTable列宽随屏幕尺寸自适应?

解决MDDataTable列宽自适应屏幕的思路

1. 使用相对比例替代固定dp值

MDDataTable的列宽支持传入相对比例值(0到1之间的浮点数),表示该列占表格总宽度的比例。表格宽度随屏幕变化时,列宽会自动按比例调整:

修改你的column_data部分:

column_data=[
    ("#", 0.15),  # 占表格宽度的15%
    ("Stuff", 0.85),  # 占表格宽度的85%
]

这种方法最简单,适合不需要最小宽度限制的场景。

2. 监听窗口尺寸变化,动态调整列宽

如果需要更精细的控制(比如给列设置最小宽度),可以监听窗口尺寸变化事件,实时计算并更新列宽:

修改后的完整代码:

from kivy.metrics import dp
from kivy.core.window import Window
from kivymd.app import MDApp
from kivymd.uix.datatables import MDDataTable
from kivymd.uix.screen import MDScreen

rowdata = [
    ('1', 'something'),
    ('2', 'another thing'),
    ('3', 'a waaaaaaaaaaaaaaaayyyyyyy longer thing')
]

class Test(MDApp):

    def build(self):
        self.data_tables = MDDataTable(
            size_hint=(1, 0.7),
            use_pagination=False,
            check=False,
            rows_num=15,
            column_data=[
                ("#", dp(60)),
                ("Stuff", dp(400)),
            ],
            row_data=rowdata,
        )
        # 绑定窗口尺寸变化事件
        Window.bind(on_size=self.update_column_widths)
        screen = MDScreen()
        screen.add_widget(self.data_tables)
        return screen

    def update_column_widths(self, window, new_size):
        # 获取表格当前宽度
        table_width = self.data_tables.width
        # 第一列最小宽度为dp(60),剩余宽度给第二列
        col1_width = max(dp(60), table_width * 0.15)
        col2_width = table_width - col1_width
        # 更新列宽
        self.data_tables.column_data = [
            ("#", col1_width),
            ("Stuff", col2_width),
        ]
        # 刷新表格以应用新宽度
        self.data_tables.refresh_from_data()

if __name__ == '__main__':
    Test().run()

3. 利用auto_fit_columns参数(KivyMD 1.1.0+)

如果你使用的是较新版本的KivyMD(1.1.0及以上),可以直接启用auto_fit_columns参数,让组件自动根据内容和屏幕宽度调整列宽:

self.data_tables = MDDataTable(
    size_hint=(1, 0.7),
    use_pagination=False,
    check=False,
    rows_num=15,
    auto_fit_columns=True,  # 启用自动适配
    column_data=[
        ("#", None),  # 无需指定固定宽度
        ("Stuff", None),
    ],
    row_data=rowdata,
)

这个参数会让列优先适配内容长度,同时保证表格整体在屏幕内显示。

内容的提问来源于stack exchange,提问作者Eduardo C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:06:28