python - 小部件在 GridLayout 中的位置

标签 python kivy

我正在尝试创建一个小部件网格,每个“单元格”小部件都有一个矩形,我可以稍后更改颜色。当我使用 grid.add_widget(Button(text=str(i))) 行运行下面的代码时,按钮会填充窗口(如文档中所示)。但是,当我像 grid.add_widget(Cell()) 一样使用我的 Cell 小部件时,所有小部件都聚集在左下角(position=[0 ,0], 大小=[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()

最佳答案

我将展示一个关于如何实现这一目标的示例。 我将创建一个网格类,并向其中添加单元格小部件。 但我只会使用一个 Canvas (gridlayouts Canvas )。 所以单元类将包含一个 InstructionGroup ,而不是制作多个 Canvas 。
为了以后能够设置每个单元格的大小、位置和颜色,这些属性必须是单元格类的属性。
属性将在 MyGridset_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()

关于python - 小部件在 GridLayout 中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38948174/

相关文章:

python - 查找字典中所有唯一的键对

python - 在 Python 中访问全局变量时的导入行为

python - 在变化时显示 kivy slider 值

android - kivy 中的屏幕支持设置为普通屏幕和大屏幕

python - 使用 kv 文件和 python 类初始化小部件之间的区别

没有 Java 的 Android 主屏幕小部件

python - 寻求一个快速的 filter() 与删除

python - 可变分辨率 Van der Corput 序列

python - "select filenames whithout extansion"的负前瞻

kivy - 将图像调整为可变/固定尺寸?