Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在kivy GridLayout中是否可以为特定的小部件指定特定的网格_Python_Pyqt_Kivy - Fatal编程技术网

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

Python 在kivy GridLayout中是否可以为特定的小部件指定特定的网格,python,pyqt,kivy,Python,Pyqt,Kivy,我已经使用很久了,我知道如果我们在PyQt中使用,我们可以在特定的网格中指定特定的小部件 比如说 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)

我已经使用很久了,我知道如果我们在PyQt中使用,我们可以在特定的网格中指定特定的小部件

比如说

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.banner
self.Refno
self.RefNoText
是一些小部件。在这种情况下,我们可以指定widget,然后指定它的行号和列号。在Kivy有可能做到这一点吗

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


有什么想法吗?

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

一个自然的选择是使用FloatLayout,通过
pos\u-hint
size\u-hint
放置小部件。您甚至可以创建一个FloatLayout子类,自动处理网格中的定位


碰巧的是,我之前创建了这个,您可以找到我的代码。我的SparseGridLayout使用子部件的
col
row
属性对其进行适当定位。如果您愿意,您也可以重写
add_widget
以精确复制qt语法,但需要了解的重要一点是我如何使用FloatLayout来放置widget。

在Kivy中,当我们向GridLayout添加widget时,我们只需指定行、列或两者

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

有一个非常好的.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

cols=1#实际上,您可以使用垂直框
盒子布局:
BigWidget:
#性质
SmallWidget:
#性质
盒子布局:
SmallWidget:
#性质
SmallWidget:
#性质
SmallWidget:
#性质
Kivy将自动用1列填充网格

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