如何在Kivy的画布中引用孩子的id?

时间:2016-03-26 02:27:03

标签: python kivy

当我尝试将ID分配给画布时,我收到错误Invalid data after declaration,但我没有看到任何其他方式引用下面的ID(例如e1)。如何在Python代码中引用e1?

<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 个答案:

答案 0 :(得分:5)

我认为在kv lang中使用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()