为什么小部件在Kivy中共享相同的画布?

时间:2013-06-07 12:01:51

标签: kivy

Kivy文档指定"each widget in Kivy already have by default their Canvas"。但是,在实践中,小部件似乎是对整个窗口的共享画布的引用,而不仅仅是为自己创建一个。

当我使用context_instrucions RotateTranslateScale的{​​{1}}时,这一点就更加清晰了。如果我在特定RotateWidget,则会影响后续小部件。一切似乎都在旋转。在绘制任何其他内容之前,我必须取消 - Rotate画布。而且,如果它在旋转的画布中或下一个画布中并不重要。指令Color也是如此。

对此默认行为强加和例外的唯一方法似乎是RelativeLayout。在这种情况下,我所说的所有内容都与RelativeLayout相关,除了Color,它继续是全球性的。有人可能会说Color不是定位指令而RelativeLayout只是相对于位置而言。 RotateTranslate是排名说明,但是Scale

我实际上只是用一个具体的例子

完成blog post

我显然遗漏了一些内容,每个Widget的部分都有自己的canvas。所以,基本上我的问题是为什么小部件似乎在Kivy中共享相同的画布?

2 个答案:

答案 0 :(得分:11)

我把自己弄成了一个大错误。这一切都开始了,因为名称canvas令人困惑。我开始认为画布是我们可以画画的空间。但不是,文档实际上非常清楚:

  

使用此类添加您想要用于绘制Kivy API - Canvas Class的图形或上下文指令)

在这里:

  

画布是一个图形对象,其中包含窗口小部件(Kivy API - Canvas Property)图形表示的所有绘图说明。

因此,画布是一组指令(或者如果我们考虑canvas.beforecanvas.after则设置)。 说明不会在canvas上绘制或执行,说明只会添加到canvas 。说明在坐标空间中执行。例如,当画布中有旋转指令时,它将在坐标空间中显示之前应用于任何VertexInstruction(例如Line) 。

因此,小部件不共享canvas,但我们添加到canvas的说明共享相同的坐标空间

答案 1 :(得分:2)

另一种选择是使用PushMatrix / PopMatrix来保存/恢复上下文(翻译/旋转),我认为这是kivy中最常用的方式。