Kivy创建了widget的新实例

时间:2014-10-17 00:04:18

标签: python widget instance kivy

我对Kivy很新,对小工具有一些疑问。 几个月前我开始搞砸Kivy。我已经阅读了一些文档,但我可能错过了很多东西。

是否可以使用自己的属性创建同一窗口小部件类的多个实例?

我的目标是有一些矩形,我可以调整大小并单独拖动。

我正在学习java课程,所以我将与我在该课程中学到的内容进行比较: 例如,假设我有一个基本的rect.java类,设置为宽度和高度两个变量。

所以在我的主.java代码文件中,我会写这样的东西来创建矩形类的一些实例:

rect s1 = new rect(2,3); // width & height
rect s2 = new rect(5,4);

然后,s1.height和s2.height会有不同的值。

在Kivy可以实现类似的功能吗?现在我有很多类在我的.kv文件中设置了相同的属性:

<rect1>:

    canvas:
        Color:
            rgba: 1, 0, 1, 0.5
        Rectangle:
            pos: root.center_x - root.width/2,root.center_y - root.height/2
            size: self.size
<rect2>:

    canvas:
        Color:
            rgba: 1, 1, 0, 0.5
        Rectangle:
            pos: root.center_x - root.width/2,root.center_y - root.height/2
            size: self.size

<rect3>:

    canvas:
        Color:
            rgba: 0, 1, 0, 0.5
        Rectangle:
            pos: root.center_x - root.width/2,root.center_y - root.height/2
            size: self.size

我已经在我的.py文件中编写代码,以便调整大小并拖动它。目前,我复制/修改了代码以使用其他每个类。

目前,如果我使用:

Window.add_widget(rect1)

它将直接在较旧的实例上创建一个新实例,但它们仍然共享相同的坐标和其他属性等。如果我用鼠标拖动,该类的所有实例都遵循相同的坐标。再一次,我的目标是拥有多个矩形,我可以调整大小并单独拖动。

2 个答案:

答案 0 :(得分:1)

Window应该只有一个小部件(应用程序根小部件)。最好通过从App.build()返回根小部件实例或在应用程序的kv文件中包含根小部件来自动添加此小部件。

在这种情况下,FloatLayout最有意义。

此外,您可以使用Scatter窗口小部件来处理转换 - 移动(翻译),调整大小和旋转 - 这可能比自己做更容易。只需将每个小部件包装在Scatter中,或者让您的小部件展开Scatter

答案 1 :(得分:1)

使用尖括号(&lt;,&gt;)定义的每个条目都是类声明而不是实例。如果要在具有不同属性的kv文件中实例化类,则使用不带尖括号的名称。

这是基于您提供的代码片段的一些工作代码:

<MovableRect>: 
    size: 50, 50
    canvas:
        Color:
            rgba: root.color
        Rectangle:
            size: self.size
            pos: self.pos

<MyRoot@Widget>: 
    MovableRect: 
        id: rect1
        color: 1, 0, 1, 0.5
        pos: 5, 5

    MovableRect:
        id: rect2
        color: 1, 1, 0, 0.5
        pos: 130, 130

    MovableRect:
        id: rect3
        color: 0, 1, 0, 0.5
        pos: 250, 250    

# instantiation of root widget
MyRoot: 

这是python文件(没有你的移动功能,因为你没有列出它):

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.screenmanager import ScreenManager
from kivy.properties import ListProperty

class MovableRect(Widget):
    color = ListProperty([1, 0, 1, 0.5])

class Test1App(App):
    def build(self):
        pass

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

有关更完整的示例,请参阅youtube上的优秀kivy速成课程系列。有一个例子与你想要做的非常相似: https://www.youtube.com/watch?v=ChmfVOu9aIc