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

时间:2014-05-13 07:47:00

标签: 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

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

1 个答案:

答案 0 :(得分:7)

你可以:

  1. 通过执行canvas.remove()删除画布的子项并传递所需的图形说明实例。您可以使用canvas.children进行迭代并获取一个。

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