同一对象的多个子实例,更改值而不是仅选择实例

时间:2014-01-27 12:57:03

标签: python instance kivy

我正是我做错了,谢谢你的任何提醒和耐心:)

下面我在演示类中创建100个贴纸对象实例(来自类贴纸),并将它们作为子项添加到根小部件,但只使用1个变量名,这是正确的做事方式,因为在触发贴纸类的触摸方法的当前时刻,所有实例都会改变值,而不仅仅是碰巧碰到的实例。

    # root widget creation
class rootwidget(FloatLayout):
    def __init__(self, **kwargs):
        super(rootwidget, self).__init__(**kwargs)

# sticker object, WIP , labeltype,pos,size place holders
class sticker(Label):
    def __init__(self,**kwargs):
        self.labeltype = [1,2,3,4,5,6,7,8,9]
        self.xf = 0
        self.yf = 0
        super(sticker,self).__init__(**kwargs)
        self.text = str(self.labeltype[random.randint(0,len(self.labeltype)-1)])
        self.pos_hint = self.generateposhint()
        self.size_hint = size_hint=(0.01,0.01)

    # place holder for testing touch down, method to be more relevant once basics are nailed.
    def on_touch_down(self,instance):
        self.text = "T"

        #main app     
class demo(App):
    def build(self):
        self.root = root = rootwidget()


        return self.root


       #place holder loop. while testing ,to be moved into method
        while i < 200:
            lb = sticker()
            self.root.add_widget(lb)
            i = i + 1


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

1 个答案:

答案 0 :(得分:0)

我想您的问题是关于以下代码段:

    while i < 200:
        lb = sticker()
        self.root.add_widget(lb)
        i = i + 1

基本上你在这里创建了200个sticker个实例。 对于它们中的每一个,您使用变量存储对贴纸实例的引用,然后将该实例添加到root

所以基本上,你最终有200个贴纸实例从root实例作为widget子元素引用。但是您没有易于访问的所有引用,但您仍然可以通过root小部件访问它们。

  

我应该为每个实例创建不同的变量名吗?

好吧,我认为您不希望代码中包含200个变量名; - )

  

(如果是这样,它是如何动态地)并将它们分配给列表?然后添加它们?

但更严重的是,是的,可以将它们添加到列表中。这一切都取决于这些小部件的用途,以及您是否需要方便地访问这些小部件。

e.g:

sticker_list = []
for i in range(0,200):
    s = sticker()
    sticker_list.append(s)
    self.root.add_widget(s)

但正如我所说,这可能有用或无用,具体取决于您希望代码执行的操作。通常,如果您想要处理用户交互,最好使用回调事件来处理它们,阅读更多kivy示例以了解更多信息。