通过增加小部件条目来增加 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 的内容,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
的高度会随着内容的高度自动更新。
我有以下代码生成行条目的滚动视图。
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 的内容,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
的高度会随着内容的高度自动更新。