内存溢出(?)撞车

2024-10-05 14:27:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个框架FrameMain,里面有一块画布。你知道吗

我有一个框架FrameLower,里面有一块画布。也是画布上的图像。你知道吗

我用FrameMain.__placeFrames()方法在FrameMain画布上放置和删除一些FrameLower作为FrameMain.obj。你知道吗

问题是当我删除FrameMain.obj时,某个地方的内存似乎没有被完全清除。因此,它会导致程序在一段时间后崩溃,这取决于FrameLower被放置了多少次以及画布上有多少图像。你知道吗

我有足够的可用内存,正如你所预测的,~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()

Tags: 对象self程序masterobjimginitdef
1条回答
网友
1楼 · 发布于 2024-10-05 14:27:18

当您执行self.canvas.delete(self.obj)操作时,您所做的只是从画布中删除对象。与对象关联的帧不会被销毁。如果要销毁window对象,需要显式调用它的destroy。你知道吗

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

相关问题 更多 >