如何选择GridLayout Kivy的行和列?

时间:2018-01-20 15:43:43

标签: android python kivy

我正在尝试构建一个显示停车位的应用程序。

The design I made

我正在使用.kv文件来构建GUI,但我不知道如何将图像放在我想要的列和行中。 你能帮我解决这个布局问题吗?

main.py

# File name: main.py

import kivy
from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout

# Version of kivy
kivy.require('1.10.0')


class Main(AnchorLayout):
    parking_space_available = ''
    parking_space_busy = ''

    def update(self):
        app = App.get_running_app()


class MainApp(App):
    def build(self):
        return Main()


if __name__ == '__main__':
    MainApp().run()

main.kv

# File name: main.kv
<Label>:
    font_size: 20
<Main>:
    BoxLayout:
        id: main_layout
        orientation: 'vertical'
        Label:
            id: label_total
            text: 'Parking spaces total: '
            pos_hint: {'x': 0, 'top':1}
        Label:
            id: label_available
            text: 'Parking spaces available: '
            pos_hint: {'x': 0, 'top':.3}
        GridLayout:
            cols: 3
            rows: 6
            BoxLayout:
                orientation: 'horizontal'
                size_hint: 0.15, 0.2
                Image:
                    source: root.parking_space_available
                Image:
                    source: root.parking_space_available
                Image:
                    source: root.parking_space_available
        Button:
            text: 'Update'
            font_size: 20
            on_press: root.update()

3 个答案:

答案 0 :(得分:0)

Kivy的GridLayout与许多其他GUI框架不同,不允许您选择要将子项放入哪个特定行/列。而是在开始下一行之前填充一行。

但是,您可以使用ID创建自己的自定义GridLayout。

例如

class CustomRow(FloatLayout):
     pass

class CustomGrid(FloatLayout):
    pass


<CustomRow>:
     FloatLayout:
         id: 0
     FloatLayout:
         id: 1
     # etc, creating as many FloatLayouts as many number of columns you want.

<CustomGrid>:
     CustomRow:
        id: 0
     CustomRow:
        id: 1

然后在CustomGrid的py文件中

class CustomGrid(FloatLayout):

     def add_child_to_specific(self, row, col, widget):
         self.ids[row].ids[col].add_widget(widget)

答案 1 :(得分:0)

代码示例:

class Grid(GridLayout):

    def __init__(self):
        GridLayout.__init__(self, rows = 3, cols = 3);
        self.Images_list = list();
        for i in range(self.rows):
            dummy = list();
            for j in range(self.cols):
                dummy.append(Image());
                self.add_widget(dummy[-1]);
            self.Images_list.append(dummy);
        print(self.Images_list);

你可以试试这个。我的想法是:如果GridLayout的大小是3 x 3,那么当您将第二个小部件添加到GridLayout时,它将位于第1行和第2列。因此,{{1移动&#39;移动&#39;向右移动。知道了这个模式,您可以先创建GridLayout对象Image的空图像列表。 self.Images_list是网格第1行 - 第1列的图像,self.Images_list[0][0]是网格第1行 - 第2列的图像,依此类推。

self.Images_list[0][1]是第i + 1行的图像 - 网格的第j + 1列。

因此,如果您想更改第2行第3列的图片,则可以访问self.Images_list[i][j]

希望这有帮助。

答案 2 :(得分:0)

如果要使用2列1行的网格:

Grid = GridLayout(cols=2, row=1)

如果不提供row参数,它将根据其子级自动添加行。