編集:この回答は少し長くなったので、要約を次に示します。
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()