Kivy中的动态网格,每个网格元素包含多个小部件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kivy中的动态网格,每个网格元素包含多个小部件相关的知识,希望对你有一定的参考价值。

这是我在这里的第一篇文章,但我会尽量做到尽可能详细。所以我的应用程序是在python中,并且涉及kivy中的网格,其中网格中的每个元素应该包含4个额外的小部件,并且可能包含第五个小部件。四个额外的小部件应该在边缘处呈十字形,在中间处于第五个。

问题是,每当我添加一个子小部件时,它就会落在主窗口位置0,0的左下角

到现在为止还挺好。现在我只是试图让另一个小部件中的一个小部件正确显示。

继承人我的尝试:

<GridCell@Label>
    BoxLayout:
        orientation:'horizontal'
        Button:
            text:'One'
            size:10,10
            size_hint:None,None

为我的应用程序构建一个.kv文件,我会在其中放置一个框布局,然后是一个按钮。

我还尝试了以下类配置:

class GridCell(Label):

def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.root = FloatLayout()
    self.button = Button(text="test")
    self.button.x = self.root.x
    self.button.center_y = self.root.center_y
    self.root.add_widget(self.button)
    self.add_widget(self.root)

也没工作。

我只是通过在网格上调用.add添加网格单元格,并为for循环的每次迭代创建一个新创建的小部件。

所有的儿童小部件显然都是创造出来的,但它们都落在了左下角!

这是gui现在的整个代码:

import kivy
import World
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.graphics import Color, Rectangle

kivy.require('1.10.0')



class GridCell(Label):

def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.root = FloatLayout()
    self.button = Button(text="blargh")
    self.button.x = self.root.x
    self.button.center_y = self.root.center_y
    self.root.add_widget(self.button)
    self.add_widget(self.root)

def on_size(self, *args):
    self.canvas.before.clear()

    if self.id is "cliff":
        with self.canvas.before:
            Color(249 / 255, 6 / 255, 6 / 255, 0.3)
            Rectangle(pos=self.pos, size=self.size)
    if self.id is "goal":
        with self.canvas.before:
            Color(6 / 255, 6 / 255, 249 / 255, 0.3)
            Rectangle(pos=self.pos, size=self.size)
    if self.id is "start":
        with self.canvas.before:
            Color(11 / 255, 174 / 255, 6 / 255, 0.3)
            Rectangle(pos=self.pos, size=self.size)
    if self.id is "normal":
        with self.canvas.before:
            Color(119 / 255, 115 / 255, 115 / 255, 0.3)
            Rectangle(pos=self.pos, size=self.size)




class GameGridApp(App):

def __init__(self, **kwargs):
    super().__init__(**kwargs)
    self.grid = GridLayout(cols=8, rows=5)
    self.load_into()

def load_into(self):
    world = World.World(8, 5)
    world.build_gamegrid()

    for cell in world.gamegrid:
        name = str(cell.name)
        grid_cell = GridCell()
        grid_cell.text = name

        if cell.start:
            grid_cell.id = "start"
        if cell.goal:
            grid_cell.id = "goal"
        if cell.cliff:
            grid_cell.id = "cliff"
        if cell.field:
            grid_cell.id = "normal"

        self.grid.add_widget(grid_cell)

def build(self):
    return self.grid


customLabel = GameGridApp()
customLabel.run()
答案

我可以提出一个想法,创建一个'subgrids'对象和一个包含'subgrids'的'主网格'对象。这两个对象将是GridLayout对象。

这是python2.7中的一个简单示例:

import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label

class SubGrids(GridLayout):
    def __init__(self):
        GridLayout.__init__(self, cols=3, rows=3);
        self.add_widget(Label(text='1st'));
        self.add_widget(Label(text=''));
        self.add_widget(Label(text='2nd'));
        self.add_widget(Label(text=''));
        self.add_widget(Label(text='3rd'));
        self.add_widget(Label(text=''));
        self.add_widget(Label(text='4th'));
        self.add_widget(Label(text=''));
        self.add_widget(Label(text='5th'));
class Grids(GridLayout):
    def __init__(self):
        GridLayout.__init__(self, cols=2, rows = 2);
        self.add_widget(SubGrids());
        self.add_widget(SubGrids());
        self.add_widget(SubGrids());
        self.add_widget(SubGrids());
class Example(App):
    def build(self):
        return Grids()

if __name__ == '__main__':
    x = Example();
    x.run();

希望这能给出一个想法。

enter image description here

以上是关于Kivy中的动态网格,每个网格元素包含多个小部件的主要内容,如果未能解决你的问题,请参考以下文章

在 Kivy 中传递自定义小部件属性

滚动小部件中的 Kivy 标签文本换行

Kivy HELP:小部件和屏幕管理器

自定义小部件中的 dojo 数据网格未呈现

如何将小部件动态添加到网格?

网格中的网格可能吗?