我有以下代码生成行条目的滚动视图。
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行,它也不能正确扩展到更大的数字。这是必要的,因为我可能需要一个有数万行的窗口。
我忽略了哪个参数可以解释这种缩放?
答案 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
的高度会根据其内容的高度自动更新。