【问题标题】:How do I reference id's of children within a canvas in Kivy?如何在 Kivy 的画布中引用孩子的 id?
【发布时间】:2016-03-26 02:27:03
【问题描述】:

当我尝试将 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

【问题讨论】:

  • 看看this question,它解释了如何访问(和删除)特定说明。如果要更改指令的属性,请将它们绑定到根节点的属性(如&lt;...&gt;: e1_start: 0 ... Ellipse: angle_start: root.e1_start)。
  • @zeeMonkeez,你帮了我很大的忙,昨晚午夜时分,我把头撞到了墙上。如果您将此作为答案提交,我会很乐意接受,谢谢!

标签: python kivy


【解决方案1】:

我不认为在 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多