編集:この回答は少し長くなったので、要約を次に示します。
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
に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
、すべての描画命令の見かけ上の基本クラスであり、親は現在アクティブな canvas に設定されます。
self.parent = getActiveCanvas()