Kivy文档指定"each widget in Kivy already have by default their Canvas"。但是,在实践中,小部件似乎是对整个窗口的共享画布的引用,而不仅仅是为自己创建一个。
当我使用context_instrucions
Rotate
,Translate
或Scale
的{{1}}时,这一点就更加清晰了。如果我在特定Rotate
内Widget
,则会影响后续小部件。一切似乎都在旋转。在绘制任何其他内容之前,我必须取消 - Rotate
画布。而且,如果它在旋转的画布中或下一个画布中并不重要。指令Color
也是如此。
对此默认行为强加和例外的唯一方法似乎是RelativeLayout
。在这种情况下,我所说的所有内容都与RelativeLayout
相关,除了Color
,它继续是全球性的。有人可能会说Color不是定位指令而RelativeLayout只是相对于位置而言。 Rotate
和Translate
是排名说明,但是Scale
?
我实际上只是用一个具体的例子
完成blog post我显然遗漏了一些内容,每个Widget的部分都有自己的canvas
。所以,基本上我的问题是为什么小部件似乎在Kivy中共享相同的画布?
答案 0 :(得分:11)
我把自己弄成了一个大错误。这一切都开始了,因为名称canvas
令人困惑。我开始认为画布是我们可以画画的空间。但不是,文档实际上非常清楚:
使用此类添加您想要用于绘制Kivy API - Canvas Class的图形或上下文指令)
在这里:
画布是一个图形对象,其中包含窗口小部件(Kivy API - Canvas Property)图形表示的所有绘图说明。
因此,画布是一组指令(或者如果我们考虑canvas.before
和canvas.after
则设置)。 说明不会在canvas
上绘制或执行,说明只会添加到canvas
。说明在坐标空间中执行。例如,当画布中有旋转指令时,它将在坐标空间中显示之前应用于任何VertexInstruction
(例如Line
) 。
因此,小部件不共享canvas
,但我们添加到canvas
的说明共享相同的坐标空间。
答案 1 :(得分:2)
另一种选择是使用PushMatrix / PopMatrix来保存/恢复上下文(翻译/旋转),我认为这是kivy中最常用的方式。