内存溢出(?)在tkinter上崩溃

时间:2018-10-11 14:41:17

标签: python tkinter tkinter-canvas

我正在为自己做游戏。我遇到的问题是,由于某种原因,在将某些对象放在画布上并删除它们之后,程序崩溃了。更深入:

我的框架FrameMain中有一个画布。

我的框架FrameLower中有一个画布。也是画布上的图像。

我正在使用FrameLower方法在FrameMain.obj画布上放置和删除少量FrameMain作为FrameMain.__placeFrames()

问题在于,当我删除FrameMain.obj时,似乎某处的内存似乎没有完全清除。因此,根据放置FrameLower的次数以及其画布上有多少图像,一段时间后程序会崩溃。

如您所料,我有足够的可用RAM,大约6GB,所以这不是问题。

我真正想了解的是,如果没有足够的内存来存储对象,为什么崩溃了,为什么这些对象没有被完全删除。

我真正想做的就是摆脱这次崩溃。在下面的简化示例中,我放置了10000帧,但是在实际程序中,其中100帧足以杀死我的游戏-它们充满了图像。

(要使此代码按原样工作,需要根目录中的任何img.gif文件)

from tkinter import *

class FrameMain(Frame):
    def __init__(self,master):
        super().__init__(master,height=100,width=100,bg='black')
        self.grid()

        self.canvas=Canvas(self,height=100,width=100,bg='white')
        self.canvas.grid()

        self.__placeFrames(10000)

    def __placeFrames(self,number):
        for counter in range(0,number):
            self.obj=self.canvas.create_window(50,50,window=FrameLower(self.canvas))
            self.canvas.delete(self.obj)
            del self.obj



class FrameLower(Frame):
    def __init__(self,master):
        super().__init__(master,height=50,width=50,bg='red')

        self.canvas=Canvas(self,height=50,width=50,bg='blue')
        self.canvas.grid()

        self.img=PhotoImage(file='img.gif')
        self.canvas.create_image(0,0,image=self.img)

def Run():
    root=Tk()
    frameMain=FrameMain(root)
    root.mainloop()

Run()

1 个答案:

答案 0 :(得分:0)

执行self.canvas.delete(self.obj)时,您要做的就是从画布中删除对象。与对象关联的框架不会被破坏。如果要销毁窗口对象,则需要在其上显式调用destroy

在创建成千上万个项目时,画布也有一些已知的限制。它不会回收画布项目ID,因此即使删除了画布对象本身,它们仍会占用少量内存。一种解决方案是不删除画布项目,而是将其移出屏幕或将它们配置为在不需要时隐藏,然后重新配置它们而不创建新项目。