如何在Kivy的画布中引用孩子的ID? [英] How do I reference id's of children within a canvas in Kivy?

查看:99
本文介绍了如何在Kivy的画布中引用孩子的ID?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试为画布分配ID时,出现错误Invalid data after declaration,但在下面没有看到其他进一步引用ID的方法(例如e1).如何在我的Python代码中引用e1?

I get the error Invalid data after declaration when I try to assign an id to canvas, but I don't see any other way of referencing the id's further below (for example e1). How do I reference e1 in my Python code?

<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

推荐答案

我认为

I don't think the use of instruction groups in kv lang is well documented, but here is an example for how to use them to later access Canvas elements. This example also show how to use properties to control aspects of a Canvas instruction:

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()

这篇关于如何在Kivy的画布中引用孩子的ID?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆