编辑:这个答案有点冗长,所以这里是总结:
with self.canvas
为以下代码块定义当前活动的画布。
- 所有绘图指令都喜欢
Color
或Ellipse
在活动画布上绘图。
命名空间实际上与它没有任何关系,重要的是上下文(见下文)。
该with
语句允许您使用所谓的上下文管理器。
语法是这样的
with thing [as foo]:
其中thing
通常是用contextlib.contextmanager
装饰器装饰的函数。上下文管理器的具体作用取决于thing
实现方式。
但它没有做的是让变量神奇地出现在你的范围内。可以通过可选as foo
子句获得对上下文的引用,但仅此而已。Color
并且Ellipse
在您的示例中来自其他地方(可能是进口?)。
为了找出该行中上下文管理器的确切作用,with self.canvas
您应该查看API 文档或.kivy.graphics.instructions.Canvas
以下是本教程的相关摘录:
通过使用 with 语句,所有正确缩进的连续绘图命令都将修改此画布。with 语句还确保在我们绘制之后,可以正确清理内部状态。
所以使用Color
and会Ellipse
影响self.canvas
,但它们并没有被 with 语句以任何方式定义。
查看源代码,这是它的工作原理:
def class CanvasBase(InstructionGroup):
def __enter__(self):
pushActiveCanvas(self)
def __exit__(self, *largs):
popActiveCanvas()
__enter__
并__exit__
定义如果输入上下文管理器(在with
语句之后的第一行缩进代码之前)并退出时会发生什么。
在这种情况下,画布只是被推入定义当前活动画布的堆栈(如果退出上下文管理器,则从其中弹出)。
在kivy.graphics.instructions.Instruction
所有绘图指令的明显基类中,父级设置为当前活动的画布:
self.parent = getActiveCanvas()