2017-12-27 21 views
1

제 GUI에서 ttk.notebook을 만든 다음 각 탭에 텍스트 위젯을 넣고이 텍스트 위젯에 로그 정보를 덤프합니다. 새 로그 파일 세트를 사용하여 프로세스를 다시 시작하면 이전 탭을 누른 다음 새 탭을 만듭니다. 나는 이것을 할 때 원본 Text 위젯에서 사용 된 숫양이 지워지지 않는 것을 알아 챘다. 이 램을 어떻게 풀 수 있습니까?Tkinter TEXT 위젯에 사용 된 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() 

, 그것은 위젯을 만들고 그것으로 텍스트의 무리를 덤프합니다. "Clear tabs"버튼으로 제거제를 호출하면 모든 탭을 잊어 버리지 만 그 텍스트가 사용하는 램은 결코 자유롭지 않습니다. 텍스트 위젯을 파괴하더라도 숫양은 풀리지 않습니다. 이걸 어떻게 풀 수 있습니까?

+0

짧은 이야기 - 알려진 "버그"이며 아무 것도 할 수 없습니다. – CommonSense

+0

@CommonSense – sidnical

답변

1

속성 중 하나만 구성해야하는 경우 위젯 전체를 삭제하는 것은 매우 좋지 않은 디자인처럼 들리지만, 이미 본 것처럼 비싼 메모리 누수로 인해 악명이 높습니다.

어쨌든 변경 사항이 만료되었을 때이를 삭제/재 작성하는 것과는 대조적으로 기존 위젯을 구성하는 것만으로 훨씬 나을 것입니다.

내가 이해할 수있는 것으로부터, Text 위젯에 텍스트 (즉, 로그?)를 자주 표시해야한다고 했으므로 이미 가지고있는 텍스트를 지우고 새 텍스트를 삽입하는 것이 좋습니다. 위젯 :

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

감사합니다. 탭에서 .forget()을 (를) 파괴하는 것과 같은 방식으로 수행합니까? 로그 집합을 파싱 할 때마다 다른 양의 탭이 만들어집니다. 두 번째 시간에만 두 개의 탭이 필요하지만 9 개의 탭이 표시된다면 7 개의 탭을 사용해야합니다. 사용하지 않기 때문에 제거해야합니다. 또한 텍스트 위젯에서 모든 텍스트를 삭제하면 사용 된 RAM을 비우지 않습니다. 따라서 한 세트의 로그가 2GB의 RAM을 사용하고 다음에 500MB의 RAM을 사용한다면 응용 프로그램은 여전히 ​​2GB의 RAM을 보유하고 있습니다. 그것이 메신저를 해방하려는 기억입니다. – sidnical

+0

메모리 누수가 있습니까? 'tkinter.tk.call (위젯, 'delete', index1, index2)'? – mentalita

+0

인덱스에 1.0과 END를 사용하면 텍스트 위젯의 모든 텍스트가 삭제되지만 사용 된 메모리는 변경되지 않습니다. txt.delete ('1.0', 'end')와 동일합니다. 나는 네가 한 일이라고 생각해. – sidnical