web-dev-qa-db-ja.com

Tkinter Canvasをクリアするには?

次を使用して図形を描画する場合:

canvas.create_rectangle(10, 10, 50, 50, color="green")

Tkinterは、作成されたという事実を追跡しますか?

私が作成している単純なゲームでは、私のコードには1つのFrameがあり、長方形の束を作成し、画面をクリアするために大きな黒い長方形を描画し、更新された長方形の別のセットを描画します。

メモリ内に数千の長方形オブジェクトを作成していますか?

上記のコードを変数に割り当てることができますが、それを行わずにキャンバスに直接描画する場合、メモリ内に残るのですか、HTML5キャンバスのようにピクセルを描画するだけですか?

39
Taylor Hill

すべてのキャンバスアイテムは、Tkinterが追跡するオブジェクトです。黒い長方形を描くだけで画面をクリアすると、事実上メモリリークが発生します。最終的に、何百万ものアイテムが描画されたためにプログラムがクラッシュします。

キャンバスをクリアするには、 delete メソッドを使用します。特別なパラメーター"all"を指定して、キャンバス上のすべてのアイテムを削除します(文字列"all" "は、キャンバス上のすべてのアイテムを表す特別なタグです)。

canvas.delete("all")

キャンバス上の特定のアイテム(背景オブジェクトをディスプレイに残したまま、前景オブジェクトなど)のみを削除する場合は、各アイテムにタグを割り当てることができます。次に、"all"の代わりに、タグの名前を指定できます。

ゲームを作成している場合、おそらくアイテムを削除して再作成する必要はありません。たとえば、画面上を移動するオブジェクトがある場合、 move または coords メソッドを使用してアイテムを移動できます。

66
Bryan Oakley

キャンバスに描かれたアイテムは永続的です。 create_rectangleは、追跡する必要があるアイテムIDを返します。古いアイテムを削除しないと、プログラムの速度が遅くなります。

Fredrik Lundhの Tkinterの概要 から:

キャンバスに追加されたアイテムは、削除するまで保持されます。図面を変更する場合は、coordsitemconfig、_moveなどのメソッドを使用してアイテムを変更するか、deleteを使用して削除できます。それら。

6

はい、あなたは何千ものオブジェクトを作成していると思います。それらの束を一度に削除する簡単な方法を探している場合は、キャンバスタグ ここで説明 を使用します。これにより、多数のオブジェクトに対して同じ操作(削除など)を実行できます。

2