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

标签 python tkinter tkinter-canvas

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

我有一个框架FrameMain,里面有一个 Canvas 。

我有一个框架FrameLower,里面有一个 Canvas 。还有 Canvas 上的图像。

我正在使用 FrameMain.__placeFrames()FrameMain Canvas 上放置和删除一些 FrameLower 作为 FrameMain.obj > 方法。

问题是,当我删除 FrameMain.obj 时,某处的内存似乎没有被完全清除。因此,它会导致程序在一段时间后崩溃,具体取决于放置 FrameLower 的次数以及 Canvas 上有多少图像。

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

最佳答案

当您执行self.canvas.delete(self.obj)时,您所做的只是从 Canvas 中删除该对象。与该对象关联的框架不会被破坏。如果要销毁窗口对象,则需要显式调用它的destroy

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

关于python - 内存溢出(?)在 tkinter 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52762860/

相关文章:

python - 使用来自多个 RDD 的相同键提取和保存值的最佳方法

python - 如何更改 Python 运算符的外观?

javascript - 防止用户通过多次点击提交按钮来发布多次提交

python - 如何在 Slack webClient 中更改 file_upload 格式

python canvas在循环中创建图像

python - Tkinter 创建用透明背景覆盖屏幕的 Canvas

tkinter 文本小部件作为 html

python tkInter浏览文件夹按钮

python - 从 OptionMenu 获取所有选项的列表

python - 如何在 tkinter 中更改形状(即椭圆形)的坐标?