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

Kivy ScrollView中可调整TextInput动态适配内容问题

解决Kivy ScrollView内动态显示TextInput并适配内容高度的问题

嘿,我来帮你搞定这个Kivy的ScrollView适配问题!你遇到的核心问题是GridLayout和它的子控件MyNote没有正确设置高度依赖,导致self.minimum_height不生效。咱们一步步来修正:

问题根源

你已经给TextInput设置了size_hint_y: None和height: self.minimum_height,但作为父容器的MyNote(BoxLayout)还是默认的size_hint_y: 1,它的高度会被GridLayout强制拉伸,而GridLayout的minimum_height需要所有子控件的高度都明确(size_hint_y为None且有固定/计算高度)才能正确计算总高度。

修正方案

1. 调整MyNote的高度设置

让MyNote也使用size_hint_y: None,并通过self.minimum_height自动适配内部TextInput的高度:

<MyNote@BoxLayout>:
    orientation: 'vertical'
    size_hint_y: None  # 取消高度自适应,改为手动计算
    height: self.minimum_height  # 高度等于内部控件的最小高度
    TextInput:
        height: self.minimum_height
        multiline: True
        text_size: (self.width, None)  # 关键:让文本按宽度换行,才能正确计算高度
        size_hint_y: None
        text: '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15'

这里把TextInput的text_size改成(self.width, None)是关键——这样文本会根据控件宽度自动换行,self.minimum_height才能准确计算出内容所需的高度。

2. 修复GridLayout的高度设置

把GridLayout的固定高度1000改成self.minimum_height,同时保留size_hint_y: None:

<MainNotesBoxLayout>:
    orientation: 'vertical'
    ScrollView:
        GridLayout:
            cols: 1
            size_hint_y: None
            height: self.minimum_height  # 高度等于所有子MyNote的总高度
            MyNote:
            MyNote:
            MyNote:

这样GridLayout的高度会自动根据所有MyNote的总高度调整,ScrollView就能正常滚动显示所有内容了。

3. 动态添加TextInput的扩展(可选)

如果之后需要动态添加MyNote控件,只需要在主文件里获取GridLayout实例,然后调用add_widget()即可,比如:

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

class MainNotesBoxLayout(BoxLayout):
    def add_new_note(self):
        # 获取GridLayout实例(需要给GridLayout加个id)
        notes_grid = self.ids.notes_grid
        notes_grid.add_widget(self.MyNote())

class NotesApp(App):
    def build(self):
        return MainNotesBoxLayout()

if __name__ == '__main__':
    NotesApp().run()

对应的kv文件里给GridLayout加上id:

<MainNotesBoxLayout>:
    orientation: 'vertical'
    ScrollView:
        GridLayout:
            id: notes_grid
            cols: 1
            size_hint_y: None
            height: self.minimum_height

这样不管你添加多少个MyNote,ScrollView都会自动适配高度,每个TextInput也会根据自己的内容调整高度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:35