我正在编写一个基于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。现在我得到了我想要的结果,但是如果有人知道如何删除单个画布说明,那么很高兴知道。
答案 0 :(得分:7)
你可以:
通过执行canvas.remove()
删除画布的子项并传递所需的图形说明实例。您可以使用canvas.children
进行迭代并获取一个。
为canvas属性指定group
名称,然后使用canvas.remove_group()
。这是分类和删除大量图形指令而不保留对它们的引用的最佳方法。