如何从kivy小部件画布中删除特定指令?

8 投票
1 回答
4036 浏览
提问于 2025-04-18 06:23

我正在写一个基于Kivy的图形应用程序,里面可以动态地添加节点到绘图区域,然后用有向线连接它们。节点可以在绘图区域内拖动,而边(线)应该始终保持与节点连接。

边的类是从Widget类派生出来的。它的图形展示分为两个部分:一是线本身,二是线的尖端(像个三角形)。当绘制一个边的组件时,首先会对画布进行平移和旋转,然后再把边的尖端画到画布上。之后,画布会旋转回原来的位置,再把线的部分画上去。

当节点移动时,边的组件的画布会被清空,然后重新绘制图形展示。不过,这个过程并没有按照我预想的那样工作。

如果我在边的类的绘制方法开始时使用self.canvas.clear(),旧的线条不会被移除,结果画布上会出现多条线。

如果我使用self.canvas.after.clear(),我的绘图区域会变得一团糟,因为这个清除方法也会把画布上的PopMatrix指令移除。

我该如何仅仅从canvas.after中移除线的图形展示?有没有更好的方法?

我的边的类的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和canvas.after上。现在我得到了我想要的结果,但如果有人知道如何移除单独的画布指令,那就太好了。

1 个回答

8

你可以选择以下两种方法:

  1. 通过使用 canvas.remove() 来移除画布上的一个子元素,并传入你想要移除的图形指令的实例。你可以遍历 canvas.children 来找到你想要的那个。

  2. 给画布的一个属性指定一个 group 名称,然后使用 canvas.remove_group()。这是分类和移除很多图形指令的最佳方法,这样你就不需要单独保存它们的引用了。

撰写回答