Skip to main content
 首页 » 编程设计

python之我如何在 Kivy 的 Canvas 中引用 child 的 ID

2025年05月04日31shihaiming

当我尝试将 id 分配给 canvas 时,出现错误 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 

请您参考如下方法:

我不认为使用instruction groups in kv lang 有很好的文档记录,但这里是一个示例,说明如何使用它们稍后访问 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()