Float Layout使用Kivy添加自定义大小的小部件

时间:2014-07-11 19:26:18

标签: python python-3.x kivy

我是python和kivy的新手,我正在尝试通过制作一个小小部件来学习:

Main.py文件:

class start(App):
    def build(self):
        return Holder()

if __name__ == '__main__':
    start().run()

代码:

class Holder(FloatLayout):
    def __init__(self, **kwargs):
        self.size=(300,300)
        super(Holder,self).__init__(**kwargs)

        c=Cell()
        c.pos=(100,100)
        self.add_widget(c)
        print(str(c.pos))

        d=Cell()
        d.pos=(100,0)
        self.add_widget(d)
        print(str(d.pos))

class Cell(Widget):
    def __init__(self, **kwargs):
        super(Cell,self).__init__(**kwargs)
        with self.canvas:
            Color(1, 0, 0)
            Rectangle(size=(50, 50))

        self.height=50
        self.width=50

问题是,althogh我正在添加2个不同位置的单元格,我仍然让它们重叠,并且它们都只在角落显示。

enter image description here 你能不能让我知道我哪里出错了。

编辑: 我更新了Cell的代码如下:

class Cell(Widget):
    rect=Rectangle(size=(50, 50))
    def __init__(self, **kwargs):
        super(Cell,self).__init__(**kwargs)
        self.canvas.add(Color(1, 0, 0))
        self.canvas.add(self.rect)
        self.bind(pos=self.callback_pos)

    def callback_pos(self, value):
        self.rect.pos=self.pos

但是,现在我收到错误,因为“TypeError:callback_pos()需要2个位置参数但是3个被赋予”

1 个答案:

答案 0 :(得分:1)

您的绘图代码是

with self.canvas:
            Color(1, 0, 0)
            Rectangle(size=(50, 50))

...这正是你看到的,两个矩形都有大小(50,50)并且在默认位置(0,0),因为你没有设置它。

如果希望矩形显示窗口小部件的大小和形状,则必须自己绑定 - 即保留对矩形的引用并使用窗口小部件bind方法调用更新的函数小部件位置改变时的位置。

这有点冗长,这是我们推荐使用kv语言的一个原因 - 它为你做到了这一点!

<Cell>:
    canvas:
        Color:
            rgb: 1, 0, 0
        Rectangle:
            pos: self.pos
            size: 50, 50

每当更改时,这将自动更新pos以匹配self.pos。

你做过kivy pong教程吗?我建议这样做。您可能也对我的video tutorials感兴趣。

编辑:回复您自己的编辑:

rect=Rectangle(size=(50, 50))

你应该把这一行放在__init__中,你的方式会将同一个矩形传递给每个实例,因为它是一个类级变量。那个可能实际上并没有崩溃并在这里工作,但它不是你的意思,可能是因为这个原因的坏习惯。

  

然而,现在我收到错误&#34; TypeError:callback_pos()需要2个位置参数但是3个被给出&#34;

您有参数self, value。绑定(以及所有kivy属性绑定)实际上使用self, instance, value调用。只需添加这个额外的参数(或用*args抓住它们。)