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

Kivy ScrollView滚动后回弹异常问题求助

解决Kivy中ScrollView嵌套GridLayout后滚动回弹的问题

你的代码存在几个关键问题导致ScrollView滚动后立即回弹,以下是具体修复方案:

问题分析与修复点

  • 错误的size_hint参数格式:MainWindow中给ScrollViewExample设置size_hint = ("0.3dp", None)是错误的,size_hint接受0到1之间的比例数值,不能带单位。应改为size_hint=(0.3, 1),让侧边栏占MainWindow宽度的30%,高度占满整行。
  • ScrollView高度硬编码:ScrollViewExample中硬编码height=10000会导致布局逻辑混乱,需去掉该设置,让ScrollView的高度由父容器通过size_hint控制。
  • SideMenuStack高度未动态更新:SideMenuStack初始化时还未添加按钮,此时self.minimum_height为0,设置height = self.minimum_height后,后续添加按钮也不会自动更新高度。需通过绑定minimum_height到自身height实现动态适配。

修改后的完整代码

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.stacklayout import StackLayout


class MainWindow(GridLayout):
    def __init__(self, **kwargs):
        super(MainWindow, self).__init__(**kwargs)
        self.cols = 2
        self.rows = 1

        self.layout1 = ScrollViewExample()
        # 修正size_hint参数为比例值
        self.layout1.size_hint = (0.3, 1)
        self.add_widget(self.layout1)

        self.layout2 = MyGrid()
        # 调整比例避免布局宽度溢出
        self.layout2.size_hint = (0.7, 1)
        self.add_widget(self.layout2)


class SideMenuStack(StackLayout):
    def __init__(self, **kwargs):
        super(SideMenuStack, self).__init__(**kwargs)
        self.size_hint_y = None
        # 绑定minimum_height到height,动态适配内部控件高度
        self.bind(minimum_height=self.setter('height'))

        for i in range(100):
            button = Button(text=str(i), size_hint=(None, None), size=("92dp", "92dp"))
            self.add_widget(button)


class ScrollViewExample(ScrollView):
    def __init__(self, **kwargs):
        super(ScrollViewExample, self).__init__(**kwargs)
        # 移除硬编码高度,由父容器控制尺寸
        self.size_hint = (1, 1)
        self.layout1 = SideMenuStack()
        self.do_scroll_y = True
        self.do_scroll_x = False
        self.add_widget(self.layout1)


class MyGrid(GridLayout):
    pass


class GuiApp(App):
    def build(self):
        return MainWindow()


if __name__ == "__main__":
    GuiApp().run()

额外说明

  • 调整MyGrid的size_hint_x为0.7,确保两列布局宽度总和为1,避免出现挤压或溢出问题。
  • 通过self.bind(minimum_height=self.setter('height')),SideMenuStack的高度会随内部按钮的添加自动调整,确保ScrollView能正确计算可滚动区域,彻底解决回弹问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 05:03:27