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

Python Kivy应用中ScrollView无法滚动的问题求助

解决Kivy ScrollView无法滚动的问题

你的ScrollView失效的核心原因是:作为ScrollView子控件的main_layout(BoxLayout)默认size_hint_y=1,它的高度会被限制在ScrollView的可视范围内,不会随内容扩展。要修复这个问题,只需给main_layout设置size_hint_y=None,并绑定它的minimum_height到自身高度,让它的高度随内部内容自动调整。

修改后的完整代码:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView


class Program(App):
    def build(self):
        # 给main_layout设置size_hint_y=None,并绑定minimum_height
        self.main_layout = BoxLayout(orientation="vertical", size_hint_y=None)
        self.main_layout.bind(minimum_height=self.main_layout.setter("height"))

        self.firstrow = BoxLayout(size_hint_y=None, height=44)
        self.secondrow = BoxLayout(size_hint_y=None, height=44)
        
        self.grid_izgara = GridLayout(cols=5, spacing=10, padding=10, size_hint_y=None)
        self.grid_izgara.bind(minimum_height=self.grid_izgara.setter("height"))

        self.scroll_view = ScrollView(size_hint=(None, None), size=(700, 900))
        
        self.eqn = Label(text="Equation")
        self.equation = TextInput(size_hint_y=None, height=44)

        self.buton = Button(text="Drop Down Menu", size_hint_y=None, height=44)

        self.lowerBound = Label(text="Lower Bound", size_hint_y=None, height=44)
        self.lowerB = TextInput(size_hint_y=None, height=44)  # 设置固定高度,避免布局混乱
        self.upperBound = Label(text="Upper Bound", size_hint_y=None, height=44)
        self.upperB = TextInput(size_hint_y=None, height=44)

        self.maxIteration = Label(text="Max Iteration", size_hint_y=None, height=44)
        self.maxI = TextInput(size_hint_y=None, height=44)
        self.tolerance = Label(text="Toleration", size_hint_y=None, height=44)
        self.toler = TextInput(size_hint_y=None, height=44)

        self.solveButon = Button(text="Solve It", size_hint_y=None, height=44)

        # 添加更多按钮测试滚动效果
        for i in range(50):
            self.grid_izgara.add_widget(Button(text=f"按钮{i+1}", size_hint_y=None, height=44))

        self.firstrow.add_widget(self.eqn)
        self.firstrow.add_widget(self.equation)

        self.secondrow.add_widget(self.solveButon)

        self.main_layout.add_widget(self.firstrow)
        self.main_layout.add_widget(self.buton)
        self.main_layout.add_widget(self.secondrow)
        self.main_layout.add_widget(self.grid_izgara)
        
        self.scroll_view.add_widget(self.main_layout)
        return self.scroll_view


Program().run()

关键修改点:

  • 初始化main_layout时添加size_hint_y=None
  • 绑定main_layout的minimum_height到自身高度:self.main_layout.bind(minimum_height=self.main_layout.setter("height"))
  • 给所有TextInput和Solve按钮也设置了size_hint_y=None, height=44,保证布局高度稳定,避免不可控的高度扩展

这样修改后,当main_layout内部的内容总高度超过ScrollView的高度(900)时,就可以正常滚动了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:43:14