次のコードを使用すると、小惑星の画像が画面上を移動するとメモリ使用量が急速に増加し、画像がキャンバスの端を超えると増加が止まります。なぜこれが起こるのか誰か説明できますか?プログラムで画像を無期限に画面上で動かし続けたいのですが、最終的にはシステムのすべてのメモリを使い果たしてしまいます。
私はpython、Tk、およびTkinterが初めてです。canvas.move(...) または canvas.update() について明らかに欠けているものはありますか? このタスクを達成するために別の方法を使用する必要がありますか? ありがとう。
from Tkinter import Tk, Canvas, Frame, BOTH, NW
import Image
import ImageTk
from random import random
root = Tk()
f = Frame(root)
f.pack(fill="both", expand=True)
canvas = Canvas(f, width=1000, height=1000)
canvas.pack(fill=BOTH, expand=1)
image = ImageTk.PhotoImage(Image.open("asteroid01.png"))
sprites = []
for i in range(10):
sprites.append(canvas.create_image(50*random(), 50*random(), image=image))
vel = {'x': 1, 'y': 1}
while True:
for s in sprites:
canvas.move(s, vel['x'], vel['y'])
canvas.update()
編集:更新の呼び出しは悪い習慣のように思われるため、提案されたように変更されたコードを次に示します。ただし、プログラムは画像の移動中にメモリを消費し、ウィンドウが閉じられるまでメモリを解放しません。
from Tkinter import Tk, Canvas, Frame, BOTH, NW
import Image
import ImageTk
from random import random
root = Tk()
f = Frame(root)
f.pack(fill="both", expand=True)
canvas = Canvas(f, width=1000, height=1000)
canvas.pack(fill=BOTH, expand=1)
image = ImageTk.PhotoImage(Image.open("asteroid01.png"))
sprites = []
for i in range(10):
sprites.append(canvas.create_image(50*random(), 50*random(), image=image))
vel = {'x': 1, 'y': 1}
def move():
for s in sprites:
canvas.move(s, vel['x'], vel['y'])
canvas.after(10, move)
move()
root.mainloop()