如何从kivy小部件画布中删除特定指令?
我正在写一个基于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
你可以选择以下两种方法:
通过使用
canvas.remove()
来移除画布上的一个子元素,并传入你想要移除的图形指令的实例。你可以遍历canvas.children
来找到你想要的那个。给画布的一个属性指定一个
group
名称,然后使用canvas.remove_group()
。这是分类和移除很多图形指令的最佳方法,这样你就不需要单独保存它们的引用了。