【问题标题】:Why does it seem that the widgets share the same canvas in Kivy?为什么小部件在 Kivy 中似乎共享同一个画布?
【发布时间】:2017-01-17 23:51:32
【问题描述】:

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

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

对这种默认行为施加和例外的唯一方法似乎是RelativeLayout。在这种情况下,我刚才所说的所有内容都与RelativeLayout 相关,除了Color,它仍然是全球性的。有人可能会说 Color 不是定位指令,RelativeLayout 仅与位置相关。 RotateTranslate 是位置指令,但它是 Scale 吗?

我实际上只是用一个具体的例子完成了blog post

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

【问题讨论】:

    标签: kivy


    【解决方案1】:

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

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

    这里:

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

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

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

    【讨论】:

    • 是的,没错,很高兴你想通了。画布这个名字似乎确实让一些人感到困惑。您的解释非常清楚,可能会对其他人有所帮助。也许我们应该在《编程指南》中按照这些思路说些什么。
    • 当我发现这个问题时,我遇到了类似的问题。它帮助我弄清楚画布不限于小部件空间。换句话说,一个小部件可以在其 baudaries 之外,在整个应用程序画布中进行绘制。
    • 没错,只是实际上并没有可以在其中进行绘制的画布。画布是指令列表,执行时会在坐标空间中绘制。
    • 有什么地方可以读到有关 canvas.before 和 canvas.after 的信息吗?我不明白这些差异,但它们似乎有不同的行为,尤其是在屏幕转换方面。
    • 除了执行顺序之外应该没有任何区别。当涉及到绘制组件时,例如一个按钮,然后canvas.before 中的指令在canvas 中的指令之前绘制,而这些指令又在canvas.after 中的指令之前绘制。重要的是,(1)绘制“默认”按钮的说明包含在canvas 中,以及(2)任何子组件(例如Button 中的Image)都将在canvas 和@ 之间绘制987654339@(并且递归遵循此规则)。
    【解决方案2】:

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

    【讨论】:

    • 这很有用,但名称不是很直观。我看到了这些课程,并完全忽略了它们,认为它们不相关。我仍然想了解它在内部是如何工作的。画布更像是对共享事物的引用。
    • 确实@tshirtman,我挖掘了RelativeLayoutcodeRelativeLayout 执行 PushMatrixTranslateself.posPopMatrix。我们在谈论哪个Matrix?我正在继续挖掘。我拒绝相信Matrix 与屏幕分辨率有关。
    • 现在知道了!我们可以将转换“保存”在一个小矩阵中,该矩阵“应用于”正在绘制的对象。当我说应用时,我知道有非常具体的代数矩阵运算。我记得我在大学里见过他们,但不要问我到底是哪一个。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多