我将展示一个如何实现这一目标的例子.
我将创建一个网格类,并将单元格小部件添加到它.
但我只会使用一个画布(gridlayouts画布).
所以单元格类将包含一个
InstructionGroup,而不是制作多个画布.
为了能够在以后设置每个单元格的大小,位置和颜色,这些属性必须是单元格类的属性.
属性将在MyGrid的set_attributes方法中设置.
首先,当应用程序运行时,您可以获取单元格的位置,因此我使用Clock.schedule_once方法.这将执行下一帧.
为了演示如何更改颜色,我创建了一个Clock.schedule_interval,用随机颜色为单元格的颜色设置动画.
所以这是一个例子:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.graphics import Rectangle, Color, InstructionGroup
from kivy.clock import Clock
from random import uniform
XSIZE=2
YSIZE=2
class Cell(Widget):
def __init__(self, i, **kwargs):
super(Cell, self).__init__(**kwargs)
self.ig = InstructionGroup()
self.rect = Rectangle()
self.color = Color(0.2, 0.2, 0.2*i)
self.ig.add(self.color)
self.ig.add(self.rect)
class MyGrid(GridLayout):
def __init__(self,**kwargs):
super(MyGrid,self).__init__(**kwargs)
self.rows=YSIZE
self.cols=XSIZE
for i in xrange(4):
self.add_widget(Cell(i))
self.canvas.add(self.children[0].ig)
Clock.schedule_once(self.set_attributes)
Clock.schedule_interval(self.change_color,1)
def set_attributes(self,dt):
for i in self.children:
i.rect.pos = i.pos
i.rect.size = i.size
def change_color(self,dt):
for i in self.children:
i.color.rgb = (uniform(0.0,1.0),uniform(0.0,1.0),uniform(0.0,1.0))
class GameApp(App):
def build(self):
return MyGrid()
if __name__ == '__main__':
GameApp().run()