小部件在GridLayout中的位置

时间:2016-08-15 01:30:17

标签: python kivy

我正在尝试创建一个小部件网格,每个“单元格”小部件都有一个矩形我可以改变以后的颜色。当我使用行grid.add_widget(Button(text=str(i)))运行下面的代码时,按钮会填满窗口(如文档中所示)。但是,当我在Cell中使用我的grid.add_widget(Cell())小部件时,所有小部件都会在左下角(position=[0,0]size=[100,100])聚集。我发现了这个问题Kivy: Add raw Widget to GridLayout (as opposed to Image, Button, etc)并将我的Cell类改为继承自Layout而不是Widget,但这并没有帮助。关于我做错了什么的任何想法?我想要的是一个彩色矩形网格。

版本

[INFO   ] [Kivy        ] v1.9.1
[INFO   ] [Python      ] v2.7.6 (default, Jun 22 2015, 17:58:13) 

代码

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.layout import Layout
from kivy.graphics import Rectangle, Color

XSIZE=2
YSIZE=2

class Cell(Layout):
    def __init__(self, *args, **kwargs):
        super(Cell, self).__init__(*args, **kwargs)
        with self.canvas:
            Rectangle(size=self.size, pos=self.pos)
            Color((0.2, 0.2, 0.2, 1.0))

class GameApp(App):
    def build(self):
        grid = GridLayout(rows=YSIZE, cols=XSIZE, size=Window.size)
        for i in xrange(4):
            print 'i={}'.format(i)
#            grid.add_widget(Cell())
            grid.add_widget(Button(text=str(i)))
        return grid

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

1 个答案:

答案 0 :(得分:1)

我将展示一个如何实现这一目标的例子。 我将创建一个网格类,并将单元格小部件添加到它。 但我只会使用一个画布(gridlayouts画布)。 因此,单元格类将包含InstructionGroup,而不是制作多个画布 为了能够在以后设置每个单元格的大小,位置和颜色,这些属性必须是单元格类的属性 属性将在MyGrid的{​​{1}}方法中设置 首先,当应用程序运行时,您可以获取单元格的位置,因此我使用set_attributes方法。这将执行下一帧 为了演示如何更改颜色,我创建了一个Clock.schedule_once,用随机颜色为单元格的颜色设置动画。

所以这是一个例子:

Clock.schedule_interval