KivyMD MDDialog未适配内部控件尺寸导致GridLayout内容溢出
问题原因
MDDialog加载自定义内容组件时,不会自动根据内容的实际尺寸调整弹窗大小,你创建的GridLayout默认启用了高度自适应(size_hint_y = 1),会匹配Dialog默认的内容区域高度,导致4行总高400的内容被裁剪。
解决方案
修改两处代码即可解决:
- 给GridLayout关闭y轴自适应,手动设置总高度等于所有行的高度之和,可按需加内边距避免内容贴边
- 可按需调整Dialog的宽度占比,优化显示效果
修改后的完整可运行代码如下:
from kivymd.app import MDApp from kivy.uix.boxlayout import BoxLayout from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.uix.button import Button from kivymd.uix.dialog import MDDialog class AppClass(MDApp): def build_toolbar(self): button = Button(text="Press") button.bind(on_press=self.popup) return button def build(self): self.theme_cls.theme_style = "Dark" layout = BoxLayout(orientation='vertical') toolbar = self.build_toolbar() layout.add_widget(toolbar) return layout def popup(self, instance): panel = self.build_settings_panel() self.dialog = MDDialog( type="custom", title="Settings", content_cls=panel, size_hint_x=0.8 # 弹窗宽度占屏幕80%,可自行调整 ) self.dialog.open() def build_settings_panel(self): row_num = 4 row_height = 100 padding = 20 # 上下左右内边距 # 总高度 = 行数*每行高度 + 上下内边距总和 total_height = row_num * row_height + padding * 2 panel = GridLayout( cols=2, row_default_height=row_height, size_hint_y=None, # 关闭y轴自适应,使用固定高度 height=total_height, padding=padding, spacing=10 # 单元格之间的间距 ) for i in range(row_num): panel.add_widget(Label(text="Number")) panel.add_widget(Label(text=str(i))) return panel if __name__ == '__main__': AppClass().run()
如果后续需要动态增减GridLayout的行数,只需要调整row_num的值即可,总高度会自动计算适配,不需要手动修改其他参数。
内容的提问来源于stack exchange,提问作者iWenn
相关产品推荐
相关产品推荐

