gpt4 book ai didi

python - 内存管理和 Tkinter

转载 作者:太空宇宙 更新时间:2023-11-03 14:59:55 26 4
gpt4 key购买 nike

我有一个关于 Python 内存管理的问题,特别是与使用 Tkinter 的程序有关的问题。首先,我将从一个我整理的示例开始,以测试一些简单的内存管理:

import tkinter as tk
from tkinter import ttk

class Frame1(tk.Frame):

def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.pack()
print("Frame1 created")
btn = ttk.Button(self, text = "PRESS", command = self.openFrame2)
btn.pack()

def __del__(self):
print("Frame1 destroyed")

def openFrame2(self):
self.pack_forget()
self.destroy()
frame2 = Frame2(self.parent)

class Frame2(tk.Frame):

def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.pack()
print("Frame2 created")
btn = ttk.Button(self, text = "CLICK", command = self.openFrame1)
btn.pack()

def __del__(self):
print("Frame2 destroyed")

def openFrame1(self):
self.pack_forget
self.destroy()
frame1 = Frame1(self.parent)

root = tk.Tk()
program = Frame1(root)
root.mainloop()

这个计划的目标很简单。创建一个包含带有按钮的框架的 Tkinter 窗口。当按下该按钮时,删除该框架,释放该框架所占用的所有内存,并创建一个不同的框架。

如果我按 PRESS -> CLICK -> PRESS 的顺序按下按钮我的预期结果是:

Frame1 created
PRESS:
Frame1 destroyed
Frame2 created
CLICK:
Frame2 destroyed
Frame1 created
PRESS:
Frame1 destroyed
Frame2 created

相反,我的实际结果是:

Frame1 created
PRESS:
Frame2 created
CLICK:
Frame1 created
Frame2 destroyed
PRESS:
Frame2 created
Frame1 destroyed

看到这里我有点困惑。 Frame2似乎正确地调用 __del__当我调用 self.destroy() 时的方法然而Frame1才不是。这是为什么?

最佳答案

您可能需要更改代码中的一些内容。

首先回答您在评论中提出的问题:

Would a better option be to create a manual destroyMe method that goes over and removes everything the object is using manually?

我们不需要使用pack.forget(),因为您正在破坏框架。

在容器上使用.destroy()方法会销毁该容器内的所有内容。没有必要一次毁掉一切。您可以在包含多个框架及其自己的小部件集的框架上使用它,它将破坏主框架内所有框架中的所有内容。或者,如果需要,您可以只定位一个小部件。

第二,我们不需要__del__。相反,只需将 print 语句移到 self.destroy() 命令之后即可。

看一下下面的代码。它将按照您在问题上发布的预期顺序打印,同时在此过程中销毁自身。

import tkinter as tk
from tkinter import ttk


class Frame1(tk.Frame):

def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.pack()
print("Frame1 created")
btn = ttk.Button(self, text = "PRESS", command = self.openFrame2)
btn.pack()

def openFrame2(self):
self.destroy()
print("Frame1 destroyed")
frame2 = Frame2(root)


class Frame2(tk.Frame):

def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.pack()
print("Frame2 created")
btn = ttk.Button(self, text = "CLICK", command = self.openFrame1)
btn.pack()

def openFrame1(self):
self.destroy()
print("Frame2 destroyed")
frame1 = Frame1(root)


root = tk.Tk()
frame1 = Frame1(root)
root.mainloop()

关于python - 内存管理和 Tkinter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45193035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com