2016-11-16 66 views
1

所以我想要做的是将一堆小部件添加到列表中,然后再在画布上绘制每个小部件。我正在考虑使用循环(例如,用于小部件中的小部件:),然后调用它们的绘制函数。我希望每个小部件都是自己的实体,因为它们不依赖于其他实体(例如,如果我选择删除一个,其他人也不会被删除)。到目前为止,我对最低限度(只汲取1个黄点)的代码:我知道这是可能的对象常规的Python,如可以将对象添加到列表中,并调用如何在kivy/python中添加小部件到列表中?

from kivy.app import App 

from kivy.uix.widget import Widget 

from kivy.graphics import Color, Ellipse, Line 

class YellowDot(Widget): 

    def draw(self): 
     with self.canvas: 
      Color(1,1,0) 
      Ellipse(pos=(500, 500), size=(50,50)) 

class TestApp(App): 

    def build(self): 
     game=YellowDot() 
     game.draw() 
     return game 

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

其各自的功能。是否有可能在列表中添加小部件或类似的东西?

+0

为了显示对在平民'add_widget'部件父小部件被使用。另外我会建议使用kv语言进行样式设计,这很简单,并且可以在引用更改属性时解决问题。 – syntonym

+0

小工具是普通的python对象,所以你可以做任何你想要的东西(例如,将它们存储在一个列表中,在一个字典中,给它们函数......)。 – syntonym

回答

0

有两种方法,并从中选择取决于如果你想小部件能够被垃圾收集(从内存免费)或不:

from kivy.app import App 
from kivy.uix.widget import Widget 
from kivy.weakproxy import WeakProxy 
from kivy.uix.boxlayout import BoxLayout 
from kivy.graphics import Color, Ellipse, Line 
from random import randint as r 

class Dot(Widget): 

    def __init__(self, dot_color=None, **kwargs): 
     super(Dot, self).__init__(**kwargs) 

     if not dot_color: 
      raise Exception('No color available!') 
     self.dot_color = dot_color 

     # call draw automatically 
     self.draw() 

    def draw(self): 
     with self.canvas: 
      Color(*self.dot_color) 
      Ellipse(pos=self.pos, size=self.size) 

class TestApp(App): 

    def build(self): 
     colors = ((1, 0, 0), 
        (0, 1, 0), 
        (0, 0, 1)) 

     do_weak_referencing = False # change to True for weakrefs 
     if do_weak_referencing: 
      # get the class for weak referencing 
      # variant 1 
      wp = WeakProxy 
      self.dots = [ 
       WeakProxy(
        Dot(dot_color=dc, 
         pos=(r(100, 500), r(100, 500))) 
       ) for dc in colors] 
     else: 
      # variant 2 
      self.dots = [ 
       Dot(dot_color=dc, 
        pos=(r(100, 500), r(100, 500)) 
       ) for dc in colors] 

     box = BoxLayout() 
     for dot in self.dots: 
      # where will our dot be? 
      print(dot.pos) 
      box.add_widget(dot) 

     # what the list look like? 
     print(self.dots) 
     return box 

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

注意,如果对象是一个列表为WeakProxy,并且没有添加到任何地方(作为孩子),它将被收集,如果您稍后尝试访问它,则会引发一个错误,显示它不可用(显然) - 变体1.

但是,如果您选择直接参考强参考,则不会收集该对象,除非从self.dots列表中弹出。

__init__self.draw()直接,这样你可以看到那里的点是,但你可以将其删除,并直接从App.dots调用它如:

app = App.get_running_app() 
app.dots[0].draw() 
# tada! 
相关问题