假设我在此模板中有一个自定义滑块表单:
<SliderForm@BoxLayout>:
orientation: 'vertical'
padding: [0, '5 dp']
size_hint_y: None
form_title: "Slider"
slider_value: slider_widget.value
slider_max: slider_widget.max
Label:
text: root.form_title
bold: True
text_size: (self.width - 20, self.height)
halign: 'left'
BoxLayout:
Slider:
id: slider_widget
min: 1
max: 5
value: 1
step: 1
padding: '15 dp'
Label:
text: str(int(root.slider_value))
size_hint_x: None
width: self.height
现在我需要有多个这些并考虑将它们放在一个scrollview中,但我无法想象如何。
我的尝试是:
<MyScreen>:
BoxLayout:
orientation: "vertical"
ScrollView:
BoxLayout:
orientation: "vertical"
size_hint_y: None
minimum_height: self.setter('height')
SliderForm:
form_title: "Amount"
SliderForm:
form_title: "Other"
这样,表格永远不会定位......要么它们丢失,要么叠在一起。
答案 0 :(得分:1)
BoxLayout:
minimum_height: self.setter('height')
这是不对的。首先,BoxLayout没有minimum_height属性,所以你只是创建一个不做任何事情的新属性。其次,self.setter('height')返回一个函数,但你不会调用它或任何东西,所以也什么都不做。
似乎你真的很吝啬:
GridLayout:
size_hint_y: None
height: self.minimum_height
GridLayout 具有minimum_height属性,该属性对其子项的高度求和,因此这将使其大小动态调整。这是使用ScrollView的常用方法。
但是,这不是唯一的错误。您的SliderForm包含size_hint_y: None
但实际上并未将其高度设置为任何位置,因此默认值为100像素。也许你想设置一些固定值,例如height: 600
?
答案 1 :(得分:0)
这里有两个关于使布局ScrollView
友好的选项。
class Scrollable_GridLayout(GridLayout):
def __init__(self, **kwargs):
super(Scrollable_GridLayout, self).__init__(**kwargs)
self.size_hint_y: None
self.bind(minimum_height = self.setter('height'))
选项一(上图),设置一个继承自所需布局的类并设置self.bind(minimum_height = self.setter('height'))
,选项二(下图),设置基于总计子高度的height
。
<Scrolling_GridLayout@GridLayout>:
size_hint_y: None
height: sum([c.height for c in self.children])