Kivy中的嵌套布局在左下角放置了包含小部件

时间:2014-07-21 21:26:36

标签: kivy

我可能遗漏了一些非常基本的东西,但是在嵌套布局时我在Kivy中遇到了对象放置的问题。

假设我这样做:

<RootWidget>: # Derives from StackLayout

    orientation: 'tb-lr'
    size_hint: (None, 1)
    padding: (10, 10)
    spacing: (10, 10)

    Button:
        text: "One"
        size: 100, 100
        size_hint: None, None
    Button:
        text: "Two"
        size: 100, 100
        size_hint: None, None

这会产生两个按钮,它们很好地放置在布局中,一个在另一个上面。

现在,如果我在另一个布局中嵌入按钮,就像这样:

<RootWidget>: # Derives from StackLayout

    orientation: 'tb-lr'
    size_hint: (None, 1)
    padding: (10, 10)
    spacing: (10, 10)

    Widget:
        size: 100, 100
        size_hint: None, None

        Button:
            text: "One"
            size: 100, 100
            size_hint: None, None

    Button:
        text: "Two"
        size: 100, 100
        size_hint: None, None

第一个按钮最终位于屏幕的左下角。

当我运行Kivy inspector时,它显示Widget的位置是正确的,但无论我做什么,Button的位置都是0,0。我开始怀疑它与相对与绝对坐标有关。

在保留预期位置的同时将第一个Button嵌套在其他内容的正确方法是什么?

P.S。我真的很想用kv语言而不是Python语言来做这件事,因为我使用的是复杂的模板系统,这个例子只是一个很小的例子。

1 个答案:

答案 0 :(得分:1)

由于小部件不会自动控制其子级的定位和大小,因此您需要使用BoxLayout。将小部件放置在BoxLayout中会自动控制小部件的位置和大小,这样您就不会在默认位置和大小处绘制小部件 - 在(x,y)=(0,0)和大小(100,100)

如果BoxLayout是水平的,那么在布局中添加另一个小部件将推送上一个小部件并调整它们的大小,以便它们占据水平空间的相等部分。

然后,您可以通过更改布局的子项的size_hint属性来调整每个窗口小部件的相对大小。

   Widget:
    size: 100, 100
    size_hint: None, None

    BoxLayout:
        orientation: 'horizontal'
        Button:
            text: "One"
            size: 100, 100
            size_hint: None, None