通过增加小部件条目来增加 kivy scrollview window 大小

Increase kivy scrollview window size with increase widget entries

我有以下代码生成行条目的滚动视图。

import ...

class DigestApp(App):
    def build(self):
        s = ScrollView()
        b = BoxLayout(orientation='vertical', size_hint=[1, 5])
        header = BoxLayout(orientation='horizontal')
        header1 = Label(text='#', size_hint=[.35, 1])
        header2 = Label(text='header', size_hint=[6, 1])
        checkAll = BoxLayout(orientation='horizontal')
        header3 = Label(text='Check All')
        header4 = CheckBox()
        checkAll.add_widget(header3)
        checkAll.add_widget(header4)
        header.add_widget(header1)
        header.add_widget(header2)
        header.add_widget(checkAll)
        b.add_widget(header)
        for i in range(100):
            b1 = BoxLayout(orientation='horizontal')
            n = Label(text=str(i+1), size_hint=[.35, 1])
            l = Button(text='> test header 01 02 03 04 050000000000000000000000000000000000', size_hint=[6, 1])
            c = CheckBox()
            b1.add_widget(n)
            b1.add_widget(l)
            b1.add_widget(c)
            b.add_widget(b1)
        s.add_widget(b)
        return(s)

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

产生以下输出(滚动查看所有 100 行):

这看起来很棒,只有 100 行(对于范围 (100) 中的 i),但是当我尝试添加 1000 行时,我得到以下结果。

需要注意的是滚动功能是可以的,但是显示效果明显不理想。

似乎即使我的滚动视图在 100 行时按预期工作,它也无法正确缩放到更大的数字。这是必要的,因为我可能需要一个包含数万行的 window。

我忽略了哪个参数导致了这种缩放?

为了使 ScrollView 正确滚动 BoxLayout 的内容,bsize_hint_y 应该是 None 并且它的高度应该随着内容的添加而更新。例如定义b为:

b = BoxLayout(orientation='vertical', size_hint_y=None, height=0)

并在循环内,根据添加内容的高度更新其高度:

for i in range(100):
    b1 = BoxLayout(orientation='horizontal', size_hint_y=None, height=40)
    (...)
    # Update b height
    b.height += b1.height

s.add_widget(b)
return(s)

用 40 的特定高度定义 b1 是可选的,但它使您可以控制每列的​​大小。您可以保留默认值或更改为最适合您的高度。

顺便说一句,我发现这种事情在kv语言中更容易控制,你可以在其中简单地写:

<b@BoxLayout:>
    size_hint_y: None
    height: sum(x.height for x in self.children)
    (...)

并且 b 的高度会随着内容的高度自动更新。