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

Kivy中ScrollView滚动与布局格式兼容问题求助

解决Kivy中GridLayout结合ScrollView的布局与滚动冲突问题

问题核心在于:当你给GridLayout设置size_hint_y: None和height: self.minimum_height后,GridLayout的高度由子控件总高度决定,但你给Label用的size_hint_y: .18是相对父容器(GridLayout)的高度,这就形成了循环依赖——GridLayout高度靠Label撑,Label高度又依赖GridLayout高度,最终导致布局混乱。

下面给两种可行的解决办法:

方法一:给Label设置固定高度

直接给每个Label指定固定高度,同时保留size_hint_x: 1让宽度铺满GridLayout,这样GridLayout的minimum_height能正确计算,滚动和布局都正常:

#:import utils kivy.utils
<HomeScreen>:
    FloatLayout:
        canvas:
            Color:
                rgb: utils.get_color_from_hex("#FFFFFF")
            Rectangle:
                size: self.size
                pos:  self.pos
        ScrollView:
            size: self.size
            GridLayout:
                rows: 6
                cols: 1
                spacing: 10
                size_hint_y: None
                height: self.minimum_height
                width: self.minimum_width

                Label:
                    text:"stuff1"
                    color: "black"
                    size_hint_x: 1
                    height: 120  # 固定高度,可根据需求调整

                Label:
                    text:"stuff2"
                    color: "black"
                    size_hint_x: 1
                    height: 120

                Label:
                    text:"stuff3"
                    color: "black"
                    size_hint_x: 1
                    height: 120

                Label:
                    text:"stuff4"
                    color: "black"
                    size_hint_x: 1
                    height: 120

                Label:
                    text:"stuff5"
                    color: "black"
                    size_hint_x: 1
                    height: 120

                Label:
                    text:"stuff6"
                    color: "black"
                    size_hint_x: 1
                    height: 120

                Label:
                    text:"stuff7"
                    color: "black"
                    size_hint_x: 1
                    height: 120

方法二:让Label高度绑定到ScrollView可视高度

如果希望Label高度始终是ScrollView可视区域的18%,可以通过绑定属性实现,这样每个Label高度随窗口大小自适应,同时滚动功能正常:

#:import utils kivy.utils
<HomeScreen>:
    FloatLayout:
        canvas:
            Color:
                rgb: utils.get_color_from_hex("#FFFFFF")
            Rectangle:
                size: self.size
                pos:  self.pos
        ScrollView:
            id: scroll_view  # 给ScrollView加ID用于绑定
            size: self.size
            GridLayout:
                rows: 6
                cols: 1
                spacing: 10
                size_hint_y: None
                height: self.minimum_height
                width: self.minimum_width

                Label:
                    text:"stuff1"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18  # 绑定到ScrollView高度的18%

                Label:
                    text:"stuff2"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18

                Label:
                    text:"stuff3"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18

                Label:
                    text:"stuff4"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18

                Label:
                    text:"stuff5"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18

                Label:
                    text:"stuff6"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18

                Label:
                    text:"stuff7"
                    color: "black"
                    size_hint_x: 1
                    size_hint_y: None
                    height: scroll_view.height * 0.18

注意:方法二中要给Label设置size_hint_y: None,否则绑定的height会被size_hint覆盖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:40:42