我正在尝试创建一个小部件网格,每个“单元格”小部件都有一个矩形我可以改变以后的颜色。当我使用行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()
答案 0 :(得分:1)
我将展示一个如何实现这一目标的例子。
我将创建一个网格类,并将单元格小部件添加到它。
但我只会使用一个画布(gridlayouts画布)。
因此,单元格类将包含InstructionGroup,而不是制作多个画布
为了能够在以后设置每个单元格的大小,位置和颜色,这些属性必须是单元格类的属性
属性将在MyGrid
的{{1}}方法中设置
首先,当应用程序运行时,您可以获取单元格的位置,因此我使用set_attributes
方法。这将执行下一帧
为了演示如何更改颜色,我创建了一个Clock.schedule_once
,用随机颜色为单元格的颜色设置动画。
所以这是一个例子:
Clock.schedule_interval