No se puede cerrar la aplicación Tkinter multiproceso en el botón X

Mi aplicación tiene la siguiente estructura:

import tkinter as tk from threading import Thread class MyWindow(tk.Frame): ... # constructor, methods etc. def main(): window = MyWindow() Thread(target=window.mainloop).start() ... # repeatedly draw stuff on the window, no event handling, no interaction main() 

La aplicación funciona perfectamente, pero si TclError botón X (cerrar), cierra la ventana, pero no detiene el proceso y, a veces, incluso lanza un TclError .

¿Cuál es la forma correcta de escribir una aplicación como esta? ¿Cómo escribirlo de forma segura o sin hilos?

El bucle del evento principal debe estar en el hilo principal, y el hilo de dibujo debe estar en el segundo hilo.

La forma correcta de escribir esta aplicación es así:

 import tkinter as tk from threading import Thread class DrawingThread(Thread): def __init__(wnd): self.wnd = wnd self.is_quit = False def run(): while not self.is_quit: ... # drawing sth on window def stop(): # to let this thread quit. self.is_quit = True class MyWindow(tk.Frame): ... # constructor, methods etc. self.thread = DrawingThread(self) self.thread.start() on_close(self, event): # stop the drawing thread. self.thread.stop() def main(): window = MyWindow() window.mainloop() main()