如何从 kivy 小部件画布中删除特定说明?
Posted
技术标签:
【中文标题】如何从 kivy 小部件画布中删除特定说明?【英文标题】:How can I remove specific instructions from kivy widget canvas? 【发布时间】:2014-06-30 18:54:54 【问题描述】:我正在编写一个基于 kivy 的图形应用程序,我可以在其中动态地将节点添加到绘图区域,然后将它们与有向线 (=edge) 连接起来。节点可以在绘图区域内拖动,边缘应始终与它们保持连接。
Edge 类派生自 Widget 类。它的图形表示由两部分组成,线本身(=线)和线的尖端(=三角形)。当一个 Edge 小部件被绘制时,它的画布首先被平移和旋转,然后边缘的尖端被绘制到画布上。之后,画布被旋转回原来的位置,线条部分被绘制到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】:您可以:
通过执行canvas.remove()
删除画布的子级,并传递所需的图形指令实例。您可以使用canvas.children
迭代并获得一个。
将group
名称分配给画布属性,然后使用canvas.remove_group()
。这是分类和删除大量图形指令而不保留对它们的引用的最佳方法。
【讨论】:
以上是关于如何从 kivy 小部件画布中删除特定说明?的主要内容,如果未能解决你的问题,请参考以下文章