Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么delete方法不能为Tkinter中的小部件释放内存?_Python_Python 3.x_Tkinter_Memory Leaks_Widget - Fatal编程技术网

Python 为什么delete方法不能为Tkinter中的小部件释放内存?

Python 为什么delete方法不能为Tkinter中的小部件释放内存?,python,python-3.x,tkinter,memory-leaks,widget,Python,Python 3.x,Tkinter,Memory Leaks,Widget,在Tkinter中,我有一大块更新和清除ScrolledText小部件的代码。然而,我在测试过程中注意到,存在与此相关的内存泄漏,缩小范围后,复制此行为的最简单方法是: import tkinter import tkinter.scrolledtext def meme(box_text): while True: box_text.insert("end", "meme") box_text.delete(1.0, "end") window_main

在Tkinter中,我有一大块更新和清除ScrolledText小部件的代码。然而,我在测试过程中注意到,存在与此相关的内存泄漏,缩小范围后,复制此行为的最简单方法是:

import tkinter
import tkinter.scrolledtext
def meme(box_text):
    while True:
        box_text.insert("end", "meme")
        box_text.delete(1.0, "end")
window_main = tkinter.Tk()
box_text = tkinter.scrolledtext.ScrolledText(window_main)
button = tkinter.Button(window_main, command=lambda: meme(box_text))
box_text.pack()
button.pack()
window_main.mainloop()

谁能解释我做错了什么?我不理解也不认为这与记忆有关。如果我注释掉了insert,只有delete,那么就没有内存问题,所以就我所知,循环本身不是罪魁祸首,只有insert。

我找到了罪魁祸首。对于文本小部件,默认情况下“maxundo”设置为0,因此Tkinter会保存插入其中的所有内容的日志。将此设置为1解决了问题。编辑:
undo=False
效果更好。

为什么称这是内存泄漏?你看到记忆永远在增长吗?您使用什么工具来确定这一点?每次循环迭代会泄漏多少内存?我只是在使用windows任务管理器。是的,根据insert/delete循环的不同,内存似乎会无限地增加。这可能至少部分与您从不让事件循环处理事件有关,因此事件会在不耗尽队列的情况下不断发生。因为在现实世界中你永远不会使用这样的代码,所以我不会担心。如果我将范围(100)内x的
while True
更改为
,允许它返回,仍然不会释放内存,这与我的实际代码类似。这里的问题是我正在使用一个具有insert和delete(不是无限的,也不是经常重复的)的循环,而这个问题是存在的。尽管内存会随着时间的推移而略微膨胀,但仍然令人担忧。Python不会将内存释放到操作系统,但在程序运行时,它可以被程序重用。如果你有一个真正的内存泄漏,老实说,我不认为它与重复的插入和删除有关。