問題描述
我正在嘗試創(chuàng)建一個小部件網(wǎng)格,每個單元格"小部件都有一個矩形,我可以稍后更改顏色.當我使用 grid.add_widget(Button(text=str(i)))
行運行下面的代碼時,按鈕會填充窗口(如文檔中所示).但是,當我在 grid.add_widget(Cell())
中使用我的 Cell
小部件時,所有小部件都聚集在左下角(position=[0,0]
, size=[100,100]
).我發(fā)現(xiàn)了這個問題 Kivy: Add rawWidget 為 GridLayout(與 Image、Button 等相反) 并將我的 Cell
類更改為從 Layout
而不是 Widget
繼承但這無濟于事.關(guān)于我做錯了什么的任何想法?我想要的是一個彩色矩形網(wǎng)格.
I'm trying to create a grid of widgets with each "cell" widget having a rectangle I can change the color of later. When I run the code below with the line grid.add_widget(Button(text=str(i)))
the buttons fill the window (as in the docs). However, when I use my Cell
widget as in grid.add_widget(Cell())
all the widgets are bunched in the lower left corner (position=[0,0]
, size=[100,100]
). I found this question Kivy: Add raw Widget to GridLayout (as opposed to Image, Button, etc) and changed my Cell
class to inherit from Layout
instead of Widget
but that didn't help things. Any ideas on what I'm doing wrong? What I'd like is a grid of colored rectangles.
版本
[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()
推薦答案
我將展示如何實現(xiàn)這一目標的示例.我將創(chuàng)建一個網(wǎng)格類,并向其中添加單元格小部件.但我只會使用一個畫布(gridlayouts 畫布).所以單元格類將包含一個 InstructionGroup,而不是制作多個畫布.
為了以后能夠設(shè)置每個單元格的大小、位置和顏色,這些屬性必須是單元格類的屬性.
屬性將在 MyGrid
的 set_attributes
方法中設(shè)置.
首先,當應用程序運行時,您可以獲得單元格的位置,因此我使用 Clock.schedule_once
方法.這將執(zhí)行下一幀.
為了演示如何更改顏色,我創(chuàng)建了一個 Clock.schedule_interval
,用隨機顏色為單元格的顏色設(shè)置動畫.
I will show an example on how you can achieve this.
I will create a grid class, and add the cell widgets to it.
But I will only use one canvas (the gridlayouts canvas).
So the cell class will contain an InstructionGroup, rather than make multiple canvases.
To be able to set size, position and color of each cell later, those attributes must be attributes of the cell class.
The attributes will be set in MyGrid
's set_attributes
method.
First when the app is running, you can get the positions of the cells, hence I use the Clock.schedule_once
method. That will execute the next frame.
And to demonstrate how to change the colors, I create a Clock.schedule_interval
, to animate the colors of the cells with random colors.
下面是例子:
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()
這篇關(guān)于小部件在 GridLayout 中的位置的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!