3

Kivy 文档指定“默认情况下,Kivy 中的每个小部件已经拥有它们的画布”。然而,在实践中,小部件似乎持有对整个窗口的共享画布的引用,而不是只为它们自己拥有一个。

当我使用context_instrucionsof或时Rotate,这一点变得更加清晰。如果我在一个特定的内部,它将影响后续的小部件。一切似乎都在旋转。在绘制其他任何东西之前,我必须取消画布。此外,它是在旋转的画布中还是在下一个画布中并不重要。指令也是如此。TranslateScaleRotateWidgetRotateColor

对这种默认行为强加和例外的唯一方法似乎是RelativeLayout. 在那种情况下,我刚才所说的一切都与RelativeLayout除了Color那些继续是全球性的之外。有人可以说 Color 不是定位指令,RelativeLayout只是相对于位置。Rotate并且Translate是位置指示,但它是Scale吗?

我实际上只是用一个具体的例子完成了一篇博文

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

4

2 回答 2

13

我把自己逼入了一个大错误。这一切都始于名称canvas令人困惑。我开始认为画布是我们可以在其中绘画的空间。但不是,这里的文档其实很清楚:

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

和这里:

画布是一个图形对象,其中包含小部件图形表示的所有绘图指令(Kivy API - 画布属性)。

所以,画布是一组指令(或者如果我们考虑canvas.beforecanvas.after)。指令不绘制或在 a 上执行canvas,指令只是添加到 acanvas。指令在坐标空间中执行。例如,当画布中有一个Rotate指令时,它将被应用到任何VertexInstruction一个(Line例如a)上,然后才显示在坐标空间中。

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

于 2013-06-09T08:46:05.720 回答
2

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

于 2013-06-08T11:51:25.640 回答