Hi list

I noticed this issue with a long-running application that displays
information from a variable number of sources by opening an embedded
window on a Text widget for each new source, and closing it when the
source is completed. To prevent increasing memory use, the widgets
inside the windows are "recycled", i.e. hidden using a tag and cached
when the window is closed, to be re-used when needed. New widgets are
only created when the cache is empty. 

The code below demonstrates the issue by rapidly creating and hiding a
window containing the same Label widget. On my machine, each
create_window call initially takes < 1 ms, but a few minutes later
increases to several ms. After several hours, it takes a few seconds
for each operation. 

If the commented line removing the tag is used instead of the
window_create call, there is no slowdown. Unfortunately this is not
useful in the real program, which requires that new windows open in a
specified position. AFAIK there is no way to move an embedded window on
a Text widget other than by re-calling window_create (but I'd be glad
to be wrong about that).

Any insights or suggestions?

-------------------------------

from time import time
from tkinter import *

root = Tk()
button = Button(root, text='Run')
text = Text(root)
text.tag_config('hide', elide=True)
label=Label(text, text='running')

def show_and_hide():
    if button['text']=='Stop':
        if text.tag_names(label):
            t = time()
            #this line gradually gets slower:
            text.window_create(END, window=label)
            #this line doesn't:
            #text.tag_remove('hide', label)
            print(round((time() - t) * 1000))
        else:
            text.tag_add('hide', label)
        button.after(10, show_and_hide)

def run():
    if button['text']=='Run':
        button['text'] = 'Stop'
        text.window_create(END, window=label)
        show_and_hide()
    else:
        button['text'] = 'Run'
        text.tag_add('hide', label)

button['command'] = run
button.pack()
text.pack()
mainloop()
-- 
https://mail.python.org/mailman3//lists/python-list.python.org

Reply via email to