循环创建Kivy小部件

时间:2018-07-10 23:27:28

标签: python kivy

我有一个奇异的画面,需要通过循环在其中创建元素。我可以这样做:

class HomeScreen(Screen):

    def show_tasks(self):
        global user

        tasks = DB.get_tasks(user) # Returns an array of tuples
        for task in tasks:
            self.add_widget(Label(text=task[1]))

但是,当我这样做时,标签彼此重叠-实际上在z轴上,这使得它们都不可读。相反,我希望它们在另一个上方(在y轴上)填充。不仅如此,最终我还是要根据数据创建一个类似表格的结构。

这是我的kv:

<HomeScreen>:
    name: 'home'    
    FloatLayout:
        BoxLayout:
            orientation: "horizontal"
            pos_hint: {"x": 0, "y": 0}
            GridLayout:
                id: grid
                rows: 4
                cols: 1
                padding: 10
                spacing: 10
                row_force_default: True
                row_default_height: 40
                Label:
                    text: 'Your Tasks:'
                    size_hint_x: None
                    width: 200
                    font_size: 24

对于我如何解决此问题的任何帮助或见解,将不胜感激!

1 个答案:

答案 0 :(得分:1)

在以下代码中:

self.add_widget(Label(text=task[1]))

self指的是HomeScreen类的实例,因此您要向HomeScreen而不是GridLayout添加一个孩子,也就是说,它等同于:

<HomeScreen>:
    name: 'home' 
    FloatLayout:
        ...
    Label:
        ...
    Label:
        ...

解决方案是添加到GridLayout中,以网格化该类的属性:

<HomeScreen>:
    name: 'home'
    grid: grid    # <---
    FloatLayout:
        BoxLayout:
            orientation: "horizontal"
            pos_hint: {"x": 0, "y": 0}
            GridLayout:
                id: grid
                # rows: 4
                cols: 1
                padding: 10
                spacing: 10
                row_force_default: True
                row_default_height: 40
                Label:
                    text: 'Your Tasks:'
                    size_hint_x: None
                    width: 200
                    font_size: 24

,然后在python部分中使用grid将其添加:

class HomeScreen(Screen):
    def show_tasks(self):
        global user
        tasks = DB.get_tasks(user) # Returns an array of tuples
        for task in tasks:
            self.grid.add_widget(Label(text=task[1])) # <---