【发布时间】:2012-11-11 06:30:44
【问题描述】:
使用以下代码,内存使用量随着小行星图像在屏幕上移动而迅速增加,然后随着图像移动超出画布边缘而停止增加。谁能解释为什么会这样?我想在我的程序中让图像无限期地在屏幕上移动,但它最终会耗尽我系统上的所有内存。
我是 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()
【问题讨论】:
标签: python image canvas memory-leaks tkinter