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

tot*_*ico 3 kivy

Kivy文档指出"Kivy中的每个小部件默认都有他们的Canvas".然而,在实践中,小部件似乎持有对整个窗口的共享画布的引用,而不是仅为自己创建一个.

这变得更加清晰,当我使用context_instrucionsRotate,TranslateScale.如果我Rotate在特定内部Widget,它将影响后续小部件.一切似乎都在旋转.Rotate在绘制任何其他内容之前,我必须取消画布.而且,如果它在旋转的画布中或下一个画布中并不重要.指令也是如此Color.

对此默认行为施加和例外的唯一方法似乎是RelativeLayout.在那种情况下,我所说的所有内容RelativeLayoutColor与继续全球化的外部相关.可以说Color不是定位指令而RelativeLayout只是相对于位置.Rotate并且Translate是位置说明但是它Scale

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

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

tot*_*ico 13

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

使用这个类来添加要用于绘制的图形或背景说明Kivy API - Canvas类)

和这里:

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

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

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