【问题标题】:Kivy: how to display a list of Objects in Kivy?Kivy:如何在 Kivy 中显示对象列表?
【发布时间】:2016-03-29 12:03:37
【问题描述】:

当我创建一个类时需要使对象使用该类。 我制作了一个列表,每次触摸屏幕时都会获得一个新对象。 但我不知道如何在 kivy 端显示这些对象。

这是我的python代码:

class Cow(Widget):
   pass


class Farm (Widget):       

   cow_flock = ListProperty([])
     
   def on_touch_down (self, touch):
       self.cow_flock.append(Cow())                

这是我的 kivy 代码:

<Cow>:    
    size: 70, 70  
    canvas:
        Rectangle:
            size: self.size
            pos:  self.pos

<House>:
    self.cow_flock #this should display the cows 

我出错了:

  kivy.lang.ParserException: Parser: File "<inline>", line 12:
  ...
       10:
       11:<House>:
  >>   12:    self.doorlist
       13:
       14:
  ...
  Invalid property name
     

我是 Kivy 的新手,我不知道它是如何工作的。 换句话说;我不知道我必须使用哪种语法。

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:

    如果您动态创建小部件,则必须使用父级的add_widget 方法将它们添加到父级(通常是Layout)。

    假设您的Farm 类是某种Layout(为此,FloatLayoutRelativeLayout 可能是最好的)。 您可以添加一个事件处理程序来监控cow_flock 属性的变化:

    class Farm(RelativeLayout):
        cow_flock = ListProperty()
        def on_cow_flock(self, cow_flock):
            self.clear_widgets()
            for cow in cow_flock:
                self.add_widget(cow)
    

    这会清除Farm 实例的所有子小部件,并将每头牛一一添加回来。请注意,on_cow_flock 仅在列表更改(即添加或删除项目)时触发,而不是在列表项更改时触发。

    顺便说一句,我还假设 HouseFarm 在您的代码 sn-ps 中表示相同的意思。

    【讨论】:

    • 正是我想看到的。非常感谢werry!你帮了我很多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多