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

时间:2015-05-07 21:23:13

标签: python scrollview kivy

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

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行):

enter image description here

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

enter image description here

应该注意的是,滚动功能正在工作,但显然是不可取的。

似乎即使我的滚动视图按预期工作了100行,它也不能正确扩展到更大的数字。这是必要的,因为我可能需要一个有数万行的窗口。

我忽略了哪个参数可以解释这种缩放?

1 个答案:

答案 0 :(得分:1)

要让ScrollView正确滚动BoxLayout的内容,b size_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的高度会根据其内容的高度自动更新。