如何从 kivy 小部件画布中删除特定说明?

Posted

技术标签:

【中文标题】如何从 kivy 小部件画布中删除特定说明?【英文标题】:How can I remove specific instructions from kivy widget canvas? 【发布时间】:2014-06-30 18:54:54 【问题描述】:

我正在编写一个基于 kivy 的图形应用程序,我可以在其中动态地将节点添加到绘图区域,然后将它们与有向线 (=edge) 连接起来。节点可以在绘图区域内拖动,边缘应始终与它们保持连接。

Edge 类派生自 Widget 类。它的图形表示由两部分组成,线本身(=线)和线的尖端(=三角形)。当一个 Edge 小部件被绘制时,它的画布首先被平移和旋转,然后边缘的尖端被绘制到画布上。之后,画布被旋转回原来的位置,线条部分被绘制到canvas.after。

当节点移动时,Edge 小部件的画布被清除并再次绘制图形表示。然而,这并没有按我的计划工作。

如果我在 Edge 类的 draw 方法的开头使用 self.canvas.clear() ,旧线不会被删除,我会在画布上得到多条线。

如果我使用 self.canvas.after.clear(),我的绘图区域会完全混乱,因为 clear 方法还会从 canvas.after 中删除 PopMatrix 指令。

我怎样才能从 canvas.after 中删除线条的图形表示?有更好的方法吗?

我的 Edge 类的 Kivy 文件:

<Edge>:
    id: ed
    size_hint: None, None
    canvas.before:
        Color:
            rgb: 0.9, 0.1, 0.1
        PushMatrix
        Translate:
            x: ed.translate_x
            y: ed.translate_y
        Rotate:
            angle: ed.rot_angle
            origin: ed.rot_origin_x, ed.rot_origin_y
    canvas.after:
        PopMatrix

更新 我改变了我的方法,现在我在画布上绘制所有内容,而不是在画布和 canvas.after 上绘制。现在我得到了我想要的结果,但如果有人知道如何删除单独的画布指令,我会很高兴知道。

【问题讨论】:

【参考方案1】:

您可以:

    通过执行canvas.remove() 删除画布的子级,并传递所需的图形指令实例。您可以使用canvas.children 迭代并获得一个。

    group 名称分配给画布属性,然后使用canvas.remove_group()。这是分类和删除大量图形指令而不保留对它们的引用的最佳方法。

【讨论】:

以上是关于如何从 kivy 小部件画布中删除特定说明?的主要内容,如果未能解决你的问题,请参考以下文章

Kivy 小部件行为异常

如果未动态添加,如何正确删除Kivy中的小部件

如何删除 kivy 中的小部件?

Kivy - 按 id 删除小部件

如何使 on_touch_down 小部件具体化?

Kivy 如何访问子小部件中的小部件