kivy - 滚动视图中的自定义表单

时间:2015-02-01 19:03:18

标签: python kivy

假设我在此模板中有一个自定义滑块表单:

<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"

这样,表格永远不会定位......要么它们丢失,要么叠在一起。

2 个答案:

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