kivy - 滚动视图中的自定义表单
kivy - custom form in a scrollview
假设我有一个自定义滑块表单,就像这里的模板一样:
<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
现在我需要多个这样的东西,并且正在考虑将它们放在滚动视图中,但我不知道该怎么做。
我的尝试是:
<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"
这样一来,表格就永远无法正确定位...它们要么丢失,要么堆叠在一起。
BoxLayout:
minimum_height: self.setter('height')
这是不对的。首先,BoxLayout 没有 minimum_height 属性,因此您只是创建一个什么都不做的新布局。其次,self.setter('height') returns 一个函数,但你不调用它或任何东西,所以它也什么都不做。
看来你的意思是:
GridLayout:
size_hint_y: None
height: self.minimum_height
GridLayout 确实 有一个 minimum_height 属性 对其子项的高度求和,因此这将使它的大小动态调整。这是使用 ScrollView 的正常方式。
然而,这并不是唯一的错误。您的 SliderForm 包括 size_hint_y: None
但实际上并没有在任何地方设置它的高度,因此它的默认值为 100 像素。也许你打算设置一些固定值,例如height: 600
?
这里还有两个使布局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'))
选项一(上面),设置一个 class 从所需的布局继承并设置 self.bind(minimum_height = self.setter('height'))
,选项二(下面),设置 height
基于儿童身高总和.
<Scrolling_GridLayout@GridLayout>:
size_hint_y: None
height: sum([c.height for c in self.children])
假设我有一个自定义滑块表单,就像这里的模板一样:
<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
现在我需要多个这样的东西,并且正在考虑将它们放在滚动视图中,但我不知道该怎么做。
我的尝试是:
<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"
这样一来,表格就永远无法正确定位...它们要么丢失,要么堆叠在一起。
BoxLayout:
minimum_height: self.setter('height')
这是不对的。首先,BoxLayout 没有 minimum_height 属性,因此您只是创建一个什么都不做的新布局。其次,self.setter('height') returns 一个函数,但你不调用它或任何东西,所以它也什么都不做。
看来你的意思是:
GridLayout:
size_hint_y: None
height: self.minimum_height
GridLayout 确实 有一个 minimum_height 属性 对其子项的高度求和,因此这将使它的大小动态调整。这是使用 ScrollView 的正常方式。
然而,这并不是唯一的错误。您的 SliderForm 包括 size_hint_y: None
但实际上并没有在任何地方设置它的高度,因此它的默认值为 100 像素。也许你打算设置一些固定值,例如height: 600
?
这里还有两个使布局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'))
选项一(上面),设置一个 class 从所需的布局继承并设置 self.bind(minimum_height = self.setter('height'))
,选项二(下面),设置 height
基于儿童身高总和.
<Scrolling_GridLayout@GridLayout>:
size_hint_y: None
height: sum([c.height for c in self.children])