使用以下代码,当小行星图像在屏幕上移动时内存使用量迅速增加,然后随着图像移动到画布边缘之外停止增加。谁能解释为什么会这样?我想在我的程序中让图像无限期地在屏幕上移动,但它最终会耗尽我系统上的所有内存。
我是 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()