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
相关产品推荐
相关产品推荐

