我正在尝试创建一个小部件网格,每个“单元格”小部件都有一个矩形,我可以稍后更改颜色。当我使用以下行运行下面的代码时,按钮grid.add_widget(Button(text=str(i)))会填充窗口(如文档中所示)。但是,当我使用我的Cell小部件时,grid.add_widget(Cell())所有小部件都聚集在左下角(position=[0,0],size=[100,100])。我发现了这个问题Kivy: Add raw Widget to GridLayout (而不是 Image, Button, etc)并将我的Cell类更改为继承自Layout而不是,Widget但这没有帮助。关于我做错了什么有什么想法吗?我想要的是彩色矩形网格。
版本
[INFO ] [Kivy ] v1.9.1
[INFO ] [Python ] v2.7.6 (default, Jun 22 2015, 17:58:13)
Run Code Online (Sandbox Code Playgroud)
代码
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()
Run Code Online (Sandbox Code Playgroud)
我将展示一个示例来说明如何实现这一目标。我将创建一个网格类,并向其中添加单元格小部件。但我只会使用一张画布(网格布局画布)。因此,单元格类将包含一个InstructionGroup,而不是创建多个画布。
为了以后能够设置每个单元格的大小、位置和颜色,这些属性必须是单元格类的属性。属性将在的方法
中设置。
首先,当应用程序运行时,您可以获得单元格的位置,因此我使用该方法。这将执行下一帧。
为了演示如何更改颜色,我创建了一个, 以使用随机颜色对单元格的颜色进行动画处理。 MyGridset_attributesClock.schedule_onceClock.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()
Run Code Online (Sandbox Code Playgroud)