2014-10-17 111 views
2

我对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) 

这将直接对上了年纪一个顶部创建一个新的实例,但他们仍然共享相同的坐标和其他特性等。如果我与我的鼠标拖动,该类的所有实例都遵循相同的坐标。再次,我的目标是有多个矩形,我可以调整大小并独立拖动。

回答

1

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

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

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

1

您使用尖括号(<,>)定义的每个条目都是类声明而不是实例。如果你想在具有不同属性的kv文件中实例化一个类,那么使用没有尖括号的名字。

下面是基于代码片段一些工作代码,您提供:

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

<[email protected]>: 
    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: 

这里的蟒蛇文件(没有你的运动功能,因为你没有列出来):

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