2016-11-16 43 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! 
相關問題