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])