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