2016-03-26 54 views
1

當我嘗試將一個id分配給畫布時,出現錯誤Invalid data after declaration,但是我看不到任何其他方式(例如e1)引用了下面的id。我如何在Python代碼中引用e1?我如何在Kivy的畫布中引用孩子的ID?

<MyClockWidget>: 
    face: face 
    ticks: ticks 
    el1: el1 
    FloatLayout: 
     id: face 
     size_hint: None, None 
     pos_hint: {"center_x":0.5, "center_y":0.5} 
     size: 0.9*min(root.size), 0.9*min(root.size) 
     canvas: 
      id: cand 
      Color: 
       rgb: 0.5, 0.5, 0.5 
      Ellipse: 
       size: self.size  
       pos: self.pos 
     canvas: 
      Color: 
       rgb: 0.1, 0.1, 0.1 
      Ellipse: 
       id: el1 
       size: self.size  
       pos: self.pos 
       angle_start: 0 
       angle_end: 90 
      Ellipse: 
       id: el2 
       size: self.size  
       pos: self.pos 
       angle_start: 110 
       angle_end: 130 
+1

看一看[這個問題](http://stackoverflow.com/questions/23625507/how-can-i-remove -specific-instructions-from-kivy-widget-canvas),它解釋瞭如何訪問(和刪除)特定的指令。如果要更改指令的屬性,請將它們綁定到根節點的屬性(如'<...>:e1_start:0' ...'Ellipse:angle_start:root.e1_start')。 – zeeMonkeez

+0

@zeeMonkeez你幫了我很大的忙,我昨晚在午夜過夜時把我的頭撞在了牆上。如果您將此作爲答案提交,我會很樂意接受,謝謝! – howMuchCheeseIsTooMuchCheese

回答

2

我不認爲在千伏使用instruction groups郎是有據可查的,但在這裏是如何將它們用於以後訪問Canvas元素的例子。這個例子也說明了如何使用屬性來控制Canvas指令方面:

from kivy.app import App 
from kivy.uix.slider import Slider 
from kivy.lang import Builder 
from kivy.graphics import Color 

kv = """ 
#:kivy 1.9.1 
BoxLayout: 
    orientation: 'vertical' 
    Widget: 
     id: w_canvas 
     my_color: (0, 1, 1) 
     canvas: 
      Color: 
       rgb: self.my_color 
      Rectangle: 
       pos: self.pos 
       size: (self.width/2, self.height/2) 
      Color: 
       group: 'b' 
       rgb: (0, .8, 0) 
      Ellipse: 
       group: 'a' 
       pos: (self.pos[0], self.pos[1] + self.height/2) 
       size: (self.width/4, self.height/4) 
      Ellipse: 
       group: 'b' 
       pos: (self.pos[0]+ self.width/2, self.pos[1] + self.height/2) 
       size: (self.width/4, self.height/4) 
    Button: 
     text: 'Click me' 
     on_release: app.handle_button() 
""" 
class Test(App): 
    def build(self): 
     return Builder.load_string(kv) 
    def handle_button(self): 
     # binding Canvas instruction property to Widget property 
     self.root.ids.w_canvas.my_color = (.5, .2, 0) 
     # Access single item of canvas instruction group 
     an_ellipse = self.root.ids.w_canvas.canvas.get_group('a')[0] 
     an_ellipse.pos = (an_ellipse.pos[0] + 10, an_ellipse.pos[1]) 
     # loop through all elements of canvas instruction group 
     for gitem in self.root.ids.w_canvas.canvas.get_group('b'): 
      if isinstance(gitem, Color): 
       gitem.rgb = (0, .5, 1) 
      try: 
       gitem.size = (gitem.size[0]/2.0, gitem.size[1]) 
      except: 
       pass 

Test().run()