52

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

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

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

私が作成している単純なゲームでは、コードFrameで一連の四角形を作成し、大きな黒い四角形を描画して画面をクリアし、別の一連の更新された四角形を描画します。

メモリ内に何千もの四角形オブジェクトを作成していますか?

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

4

3 に答える 3

102

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

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

canvas.delete("all")

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

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

于 2013-04-05T17:46:31.773 に答える
9

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

Fredrik Lundh のAn Introduction to Tkinter から:

キャンバスに追加されたアイテムは、削除するまで保持されることに注意してください。図面を変更したい場合は coords、 、itemconfig、 などの方法を使用しmoveて項目を変更するか、 を使用して項目deleteを削除できます。

于 2013-04-05T17:32:50.807 に答える
3

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

于 2013-04-05T17:33:27.167 に答える