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

Kivy/KivyMD中MDBoxLayout内Widget的width、height设置不生效

Kivy vertical MDBoxLayout子组件宽高不生效问题修复

核心原因

Kivy布局的优先级规则里,size_hint 权重属性优先级远高于手动设置的固定width/height:

  • 只要对应方向的size_hint_x/size_hint_y不是None,手动写的固定宽高会被布局系统直接覆盖,完全不生效
  • 你给顶部Widget设置了size_hint_y:5,垂直MDBoxLayout会按子组件的size_hint权重比例分配可用高度,此时你写的height:100直接被忽略
  • 垂直布局下子组件默认size_hint_x:1,也就是默认撑满父布局全宽,你写的width:100因为没有把size_hint_x设为None,同样不会生效
  • 额外问题:Ellipse的坐标写死了self.height -100,在Widget实际高度不符合预期的情况下,图形位置自然会偏移错位

修复方案

如果你的需求是顶部头像区域固定为100*100大小、水平居中,下方滚动区域占满剩余高度,直接把对应size_hint设为None,调整canvas绘制的坐标绑定即可,修正后的kv代码如下:

MDBoxLayout:
    orientation: "vertical"
    Widget:
        # 固定宽高必须先关闭对应方向的size_hint权重
        size_hint: None, None
        size: 100, 100
        # 水平居中
        pos_hint: {"center_x": .5}
        canvas:
            Color:
                rgb: 1, 1, 1
            Ellipse:
                # 直接绑定组件自身尺寸,不用硬编码数值
                size: self.size
                pos: self.pos
                source: 'cat-1.jpg'
                angle_start: 0
                angle_end: 360

    ScrollView:
        # 占满除顶部组件外的所有剩余高度
        size_hint_y: 1
        MDList:
            id: scroll
            OneLineAvatarIconListItem:
                id: profile
                text: "Profile"
                elevation: 10
                IconLeftWidget:
                    icon: "account-card-details-outline"

如果你本来是想按权重分配高度(比如顶部占5份、滚动区占剩下的),那就不要设置固定height,给两个子组件正确分配size_hint_y比例即可,比如顶部Widget设size_hint_y: 0.2,ScrollView设size_hint_y: 0.8,同时Ellipse的尺寸和坐标直接绑定组件自身的size和pos属性,不要硬编码减100这类固定值,避免布局错位。

异常运行效果参考

布局异常运行截图

内容的提问来源于stack exchange,提问作者taha arab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:21:33