【问题标题】:Kivy create new instance of widgetKivy 创建小部件的新实例
【发布时间】:2014-10-17 00:04:18
【问题描述】:

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

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

【问题讨论】:

    标签: python widget instance kivy


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      用尖括号()定义的每个条目都是类声明而不是实例。如果要在 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

      【讨论】:

      • 如何即时创建小部件实例,例如对用户输入做出反应?
      猜你喜欢
      • 2017-09-23
      • 2014-10-06
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多