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

