Tkinter long-running window freezes

John O'Hagan research at johnohagan.com
Wed Feb 24 18:23:38 EST 2021


On Wed, 24 Feb 2021 13:07:24 +0000
MRAB <python at mrabarnett.plus.com> wrote:

> On 2021-02-24 11:35, John O'Hagan wrote:
[...]
> > 
> > Here is some minimal, non-threaded code that reproduces the problem
> > on my system (Xfce4 on Debian testing):
> > 
> > from tkinter import *
> > from random import randint
> > 
> > root = Tk()
> > 
> > def display(label):
> >      label.destroy()
> >      label = Label(text=randint(0, 9))
> >      label.pack()
> >      root.after(100, display, label)
> > 
> > display(Label())
> > mainloop()
> >   
[...] 
> > This works for 3-4 hours, but eventually the window freezes.
> > 
> > The process uses about 26 Mb of memory at first, and this gradually
> > increases to around 30 or so by the time it freezes.
> > 
> > Any ideas what could be causing this, or even how to approach
> > debugging or workarounds?
> >   
> The problem might be that you're adding the label using .pack but not 
> removing it with .pack_forget when you destroy it.
> 
> Try doing both:
> 
> from tkinter import *
> from random import randint
> 
> root = Tk()
> 
> def display(label):
>      if label is not None:
>          label.pack_forget()
>          label.destroy()
> 
>      label = Label(text=randint(0, 9))
>      label.pack()
>      root.after(100, display, label)
> 
> display(None)
> mainloop()

Thanks for the reply, I ran this overnight but unfortunately the result
was the same. 

I'm not a tkinter expert at all, but I had gathered from the docs that
calling destroy() on a widget was sufficient to cleanly remove the
widget and all its children. Is that not the case?

In case it's relevant, to clarify what I mean by "freeze": the window
continues to display the digits indefinitely if no attempt is made to
interact with the window, but after some hours have passed, if I click
on the window the digits stop displaying, resizing causes fragmented
images of the desktop to appear in the window, and it cannot be closed
except by terminating the process (e.g, in a task manager).

Thanks

--

John


More information about the Python-list mailing list