编辑:这个答案得到了有点冗长,所以这里的总结:
with self.canvas
定义当前活动画布以下代码块。
- 在活动画布上绘制所有绘图说明,如
Color
或Ellipse
。
命名空间实际上并没有任何关系,它是重要的上下文(见下文)。
with
声明允许您使用所谓的context managers。
语法是这样
with thing [as foo]:
其中thing
通常是装饰的装饰contextlib.contextmanager
的函数。上下文管理器的功能取决于如何实现thing
。
但它没有做的是让变量神奇地出现在你的范围内。对上下文的引用可以通过可选的as foo
子句获得,但就是这样。您的示例中的Color
和Ellipse
是来自其他地方(可能是进口?)。
为了找出到底在with self.canvas
行上下文经理呢,你应该看看API documentation或source code为kivy.graphics.instructions.Canvas
什么。
下面是本教程的相关摘录:
通过使用与它声明,所有后续绘图命令 已正确缩进将修改这个画布。附带声明 也确保在我们绘图后,内部状态可以正确清理 。
所以使用Color
和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
,表观基类所有绘图指令,所述parent is set to the currently active canvas:
self.parent = getActiveCanvas()
'Color'和'Ellipse'都被'由线'从kivy.graphics import'ed导入颜色, Ellipse'。我认为你误解了'with'语句 - 它与命名空间无关。快速谷歌给[几](http://effbot.org/zone/python-with-statement.htm)[在线](http://preshing.com/20110920/the-python-with-statement-by-例如)[tutorials](http://python.about.com/od/gettingstarted/qt/py25WITH.htm),以及[官方文档](http://docs.python .ORG /参考/ compound_stmts.html#中,有语句)。 –