Kivy自定义小部件不堆叠

时间:2016-09-04 09:24:40

标签: widget position kivy kivy-language

我使用一个名为DTErrorBar的自定义窗口小部件做了一个示例布局,

<DTErrorBar>:
    RelativeLayout:
        size_hint: None, None
        size: 20, 450
        canvas:
            Color:
                rgba: col_fg
            Line:
                points: 10, 10, 10, 410
                width: 4
            Color:
                hsv: col_gn_marker_hsla
            Line:
                points: 10, 10, 10, 410
                width: 2

在我的例子中,这个小部件包含在BoxLayout中,如下所示:

    BoxLayout:
        orientation: "horizontal"
        DTErrorBar:
        Button:
        Button:
        DTErrorBar:

但是我无法通过boxLayout中的按钮和其他DTErrorBar进行堆叠,这就是我所得到的:

enter image description here

这就是我所期待的:

enter image description here

现在,您可能会问,我是如何获得我期望的图像的?它是通过对我使用自定义小部件的代码进行一些小改动而制作的:

    BoxLayout:
    orientation: "vertical"
    BoxLayout:
        orientation: "horizontal"
        RelativeLayout:
            DTErrorBar:
        Button:
        Button:
        RelativeLayout:
            DTErrorBar:

因此,将DTErrorBar小部件包装在RelativeLayout中似乎可以使它工作,但我不知道为什么,如果我已经将RelativeLayout作为DTErrorBar小部件中所有内容的包装器。

总之,我需要对DTErrorBar的定义做些什么才能获得预期的行为?如果有人能够解释我在这里犯错的原因以便从错误中吸取教训,那也很有意思,谢谢。

非预期案例的完整代码:https://gist.github.com/payala/bc54f4d3d2378a97c26c9afe88858b07

非预期案例的完整代码:https://gist.github.com/payala/9de4de166c7c1942cc923c32550bf661

编辑:jligeza回答后的修改

在python方面,DTErrorBar类声明如下:

class DTErrorBar(Widget):
    pass

这是创建从基本 Widget 类派生的自定义窗口小部件。更改为从Layout类继承解决了它:

class DTErrorBar(RelativeLayout):
    pass

通过执行此操作,在窗口小部件定义中包含RelativeLayout也不再有意义,因为窗口小部件本身是RelativeLayout,因此最终的窗口小部件定义代码变为:

<DTErrorBar>:
    size_hint: None, None
    size: 20, 450
    canvas:
        Color:
            rgba: col_fg
        Line:
            points: 10, 10, 10, 410
            width: 4
        Color:
            hsv: col_gn_marker_hsla
        Line:
            points: 10, 10, 10, 410
            width: 2

1 个答案:

答案 0 :(得分:3)

DTErrorBar应该是一些布局小部件的子类,例如RelativeLayout。如果你继承了一个简单的Widget,那么它根本不知道如何定位它的子项(这里:带有画布的相对布局),所以它将它们的所有位置设置为窗口的[0,0]。