是否可以在kivy GridLayout中为特定小部件指定特定网格

时间:2014-04-18 14:19:01

标签: python pyqt kivy

我很久以来一直在使用PyQt,我知道如果我们在PyQt中使用QGridLayout ,我们可以在特定网格中指定特定的小部件。

例如

grid = QtGui.QGridLayout()
grid.setSpacing(10)
grid.addWidget(self.Banner,0,0,1,4,QtCore.Qt.AlignTop | QtCore.Qt.AlignCenter)
grid.addWidget(self.RefNo,1,0,1,2)
grid.addWidget(self.RefNoText,1,2,1,2)

其中self.bannerself.Refnoself.RefNoText是一些小部件。在这种情况下,我们可以指定小部件,然后行号。对于它和列号。为了它。在Kivy有可能这样做吗?

我在Kivy尝试过但似乎在Kivy中我们必须在开始时指定行和列,然后在添加小部件时它们是自己安排的吗?

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

在Kivy中,当我们向GridLayout添加小部件时,我们只需指定行,列或两者。

然后我们将定位留给Kivy,根据我们的规格自动填充它。

查看Official Documentation for GridLayout

有一个非常好的.gif文件解释了如何在GridLayout中安排小部件。

所以,你的问题的答案是否定的。我们无法指定放置窗口小部件的位置,但是,我们所能做的就是将窗口小部件添加到GridLayout中,使其正确定位。

最初,我发现制作小部件比一次小区占用更多空间有困难,如下所示:

<2 cells><1cell>
+--------+-----+
|Big     |     |
|Widget  |     |
+--------+-----+
|   |    |     |
|   |    |     |
+---+----+-----+

然而,这可以解决使整个行成为BoxLayout。像这样:

<1 big BoxLayout>
+--------+-----+
|Big     |     |
|Widget  |     |
+--------+-----+
|   |    |     |
|   |    |     |
+---+----+-----+
<1 more BoxLayout>

这样,每个BoxLayout只占用一个单元格。可以使用BoxLayout自定义窗口小部件的间距,然后将其放置在网格中。

以下是如何在Kv中做到这一点:

<MyGrid>
    cols=1 # Actually, you can just use a vertical box

    BoxLayout:

        BigWidget:
            # Properties
        SmallWidget:
            # Properties

    BoxLayout:

        SmallWidget:
            # Properties
        SmallWidget:
            # Properties
        SmallWidget:
            # Properties

Kivy会自动用1列填充网格

因此,通过嵌套布局,您可以获得所需的输出。

答案 1 :(得分:2)

Kivy的GridLayout与PyQt完全不同,并不适合这个特定用途。

一种自然的替代方法是使用FloatLayout,通过pos_hintsize_hint放置小部件。您甚至可以创建一个FloatLayout子类来自动处理网格中的定位。

碰巧,我之前创建了这个,你可以找到我的代码here。我的SparseGridLayout使用子窗口小部件的colrow属性来适当地定位它。如果您愿意,也可以覆盖add_widget以精确复制qt语法,但重要的是要了解我是如何使用FloatLayout放置小部件的。