Python 清除Tkinter文本小部件的已用RAM

Python 清除Tkinter文本小部件的已用RAM,python,python-3.x,tkinter,textbox,Python,Python 3.x,Tkinter,Textbox,在我的GUI中,我创建了一个ttk.notebook,然后将文本小部件放入每个选项卡中,并将日志/信息转储到这些文本小部件中。如果使用一组新的日志文件重新启动该进程,则I.forget()旧选项卡,然后创建新选项卡。我注意到,当我这样做时,原始文本小部件中使用的ram没有被清除。我怎样才能释放这只公羊 例如: from tkinter import * from tkinter.ttk import Notebook main = Tk() def maker(): nb = Noteb

在我的GUI中,我创建了一个ttk.notebook,然后将文本小部件放入每个选项卡中,并将日志/信息转储到这些文本小部件中。如果使用一组新的日志文件重新启动该进程,则I
.forget()
旧选项卡,然后创建新选项卡。我注意到,当我这样做时,原始文本小部件中使用的ram没有被清除。我怎样才能释放这只公羊

例如:

from tkinter import *
from tkinter.ttk import Notebook
main = Tk()
def maker():
    nb = Notebook(main, name='nbook')
    nb.grid(row=0, column=0, columnspan=2)
    frame1 = Frame(name='frame1')
    txt = Text(frame1, wrap=NONE)
    txt.grid()
    nb.add(frame1, text='textwindow')
    txt.insert('end', 'hello\n' * 1000000)

def remover():
    print(main.winfo_children())
    for tab in main.children['nbook'].tabs():
        main.children['nbook'].forget(tab)
    print(main.winfo_children())

b1 = Button(main, text='Insert', command=maker)
b1.grid(row=1, column=0)
b2 = Button(main, text='Clear tabs', command=remover)
b2.grid(row=1, column=1)
main.mainloop()
在本例中,当您单击“插入”时,它将创建小部件并向其中转储一组文本。如果你用“清除标签”按钮调用remover,它会忘记所有标签,但该文本使用的ram永远不会空闲。即使您破坏了文本小部件,ram也不会被释放。我怎样才能把它释放出来

当您只需要配置一个小部件的属性时,销毁整个(一组)小部件听起来像是一个非常糟糕的设计,而且这种做法因导致昂贵的内存泄漏而臭名昭著,正如您已经看到的那样

在任何情况下,我认为您只需配置您已有的小部件,而不是在更改到期时销毁/重新创建它们,这样会更好

据我所知,你说你需要经常在
文本
小部件中显示一些文本(即日志?),那么为什么不清除已有文本并将新文本插入小部件中呢

txt.delete('1.0', 'end') # clearing the text widget
txt.insert('end', my_log) # inserting the log into the text widget

我后来发现,仅仅在选项卡上执行
.forget()
,并不能消除小部件使用的内存。这可能是因为它们在其他地方被引用,但我找不到来源。如果在对选项卡本身执行
.forget()
之前,我从选项卡中删除了小部件,那么内存最终会被垃圾收集器释放。在我的情况下,通过该工具运行一组新的日志会重用当前使用的内存,多余的(如果有的话)会在占用一段时间后释放

Text.delete('1.0', END)
Text.edit_reset()
将清除文本小部件的历史记录,因此在删除后调用此函数。
希望这能解决您的问题

在选项卡上执行.forget()与销毁相同吗?每次解析一组日志时,都会创建不同数量的选项卡。如果第二次只需要2个标签,但显示了9个,我仍然需要删除7个标签,因为它们没有被使用。此外,如果从文本小部件中删除所有文本,则不会释放使用过的ram。因此,如果一组日志使用2GB的ram,而下一组日志使用500MB的ram,那么应用程序仍然保留以前的2GB ram。这就是我试图释放的内存。这会导致内存泄漏吗
tkinter.tk.call(小部件'delete',index1,index2)
?如果我对索引使用1.0和END,这将删除文本小部件中的所有文本,但使用的内存不会改变。与执行txt.delete('1.0','end')相同。我想这就是你想要的。长话短说——这是一个已知的“bug”,你对此无能为力。通过这样做,然后销毁,我实际上看到使用的内存增加了2MB,而不是下降。