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

MrB*_*son 7 python kivy

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

Edge类派生自Widget类.它的图形表示由两部分组成,即线本身(=线)和线尖(=三角形).绘制"边"窗口小部件时,首先会对其画布进行平移和旋转,然后将边缘的尖端绘制到画布上.之后,画布旋转回原始位置,线条部分被绘制到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
Run Code Online (Sandbox Code Playgroud)

更新 我改变了我的方法,现在我在画布上绘制所有内容,而不是绘制到画布和canvas.after.现在我得到了我想要的结果,但是如果有人知道如何删除单个画布说明,那么知道它会很好.

tit*_*ito 7

你可以:

  1. 通过执行canvas.remove()并传递所需图形指令的实例来删除画布的子项.你可以迭代并获得一个canvas.children.

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