2017-05-15 12 views
1

tkinterグラフィックはturtleの小さなゲームを作った。 Cracker BarrelのTriangle Peg Gameのシミュレーションです。これは、他の機能の中でも、ゲームの任意のポイントで次の最良の動きをプレイヤーに伝えることができます。ペグはturtle.RawPenというサブクラスのインスタンスに過ぎず、移動を表す矢印を描画するために平凡なインスタンスRawPenをたくさん保持します。タートルを完全に削除するには

私はタートルを削除するように見えないので、タートルのウィンドウを殺すためにゲーム(​​を呼び出す)を再起動すると、そのメモリ消費は実際に増加することに気付きました。私がwindow.clear()に電話して_turtleswindow.__dict__にクリアしても、まだカメへの参照があります。私はそれらに行うすべての参照が再起動中に削除されることを保証しました。それは問題ではありません。カメを本当に削除してガベージコレクションできる方法はありますか?

+0

は、私はこれをプレイして、あなたは、個々の亀の参照カウントがにドロップするように取得するために、両方の 'window.clear()'そして 'window.byeを()'呼び出す必要があります結論づけゼロ。 '.clear()'は 'window._turtles'を処理し、' .bye() 'は' onclick() 'のようなタートルイベントメソッドによって引き起こされる余分な参照を処理します。あなたの追加の参照がどこから来ているのかは言えません。 – cdlane

+0

私は使用しているすべてのカメ( 'peg_dir'、' graveyard'、 'artist_dir')にデバッグ中に' gc.get_referrers() 'を使いました。唯一の参照は' window._turtles'を含むリストでした。イベントメソッド。 'window.clear()'と 'window.bye()'を使ってすべてのリストをクリアしようとしました。 'gc.collect()'は 'peg_dir'のオブジェクトに到達できないと言っています。理由は分かりません。私はそれを調べます。 –

答えて

1

TurtleWindow、もちろん、を含む)、その後canvas.destroy()でトリックをキャンバスなかった破壊キャンバス内のオブジェクトへのすべての私の参照を削除。おそらく他にも解決策がありますが、これが私が考えることができる最高のものでした。少なくともturtle APIを使用して作成されていないオブジェクトについては、将来的にはうまくいくため、皆様の助力に感謝します。

0

メモリを消費するオブジェクトを削除して、Pythonの組み込みのgarbage collectorインターフェイスを使用して明示的にゴミを収集しようとしましたか?

import gc 
... 
# Delete memory-consuming object 
del window._turtles 
# Collect the garbage 
gc.collect() 
+0

私はデバッグ中にそのオブジェクトに到達できませんでしたが、もう一度やり直して、すべての参照がなくなっていることを絶対に確認します。私はそれがなぜ助けになるかわかりません。とにかく参照が残っていなければ自動的にガベージコレクションが行われてはならないし、参照があれば明示的にガベージコレクションを行うことも不可能ではない? –

+1

私はかつて、ある関数が大きなNumpy配列をローカルで使用するプロジェクトを持っていました。私はこの配列が関数のスコープを離れると自動的にガベージコレクトされると思っていましたが、CPU使用量はPythonが隠れた参照を保持していることを示していました...関数を離れる前に 'del array'と' gc.collect()私は本当に記憶を解放することができました。 – Josselin

1

カメのデータを取り除くために行うには、通常のものはリセット()です:

:カメのリストについては

carl=Turtle() 
.... code 
carl.reset() 

、ここでキム、ドナルド、ファニーとフランクは、すべてのカメです

group=[kim,donald,fanny,frank] 
for turtle in group: 
    turtle.reset() 

はまた、特定の画面上のすべてのカメのための便利なコードがあり、これは(screen.turtles)と呼ばれるリストに組み込まれています。あなたはスクリーンと呼ばれるスクリーンを持っているのであれば:

screen=Screen() 
... 
code 
.... 

for turtle in screen.turtles(): 
    turtle.reset() 
+0

'あなたの' reset() 'ループを画面に表示します。turtles() 'は効果的に' turtle.resetscreen() '(別名' turtle.Screen()。reset() ')と同じです。 'turtle.reset()によって解放された重要なメモリ(OPの質問)は、カメの**元に戻す**バッファをクリアしています。他のメモリ要素は単にデフォルト値にリセットされます。タートルのガベージコレクションを促進するには、 'turtle.clearscreen()'(別名 'turtle.Screen()。clear()')を使用し、変数を含むすべてのカメをNoneに設定します。 – cdlane

関連する問題