Intentando arreglar tkinter GUI congelamientos (usando hilos)

Tengo un creador de informes Python 3.x que está tan vinculado a E / S (debido a SQL, no a Python) que la ventana principal se "bloqueará" paraminuto mientras se crean los informes.

Todo lo que se necesita es la capacidad de usar las acciones estándar de la ventana (mover, redimensionar / minimizar, cerrar, etc.) mientras la GUI está bloqueada (todo lo demás en la GUI puede permanecer "congelado" hasta que todos los informes hayan terminado) .

Añadido 20181129: en otras palabras, tkinter solo debe controlar el CONTENIDO de la ventana de la aplicación y dejar el manejo de todos los controles de ventana estándar (externos) a la O / S. Si puedo hacer eso, mi problema desaparece y no necesito usar todos los subprocesos / subprocesos (los bloqueos se convierten en un comportamiento aceptable similar en efecto a la desactivación del botón "Hacer informes").

¿Cuál es la forma más fácil / simple (=mínim perturbar el código existente) de hacer esto, idealmente de una manera que funcione con Python> = 3.2.2 y de una manera multiplataforma (es decir, funciona al menos en Windows y Linux).

Todo lo siguiente es información de soporte que explica el problema con mayor detalle, los enfoques probados y algunos problemas sutiles encontrados.

Cosas para considerar

Los usuarios eligen sus informes y luego presionan el botón "Crear informes" en la ventana principal (cuando comienza el trabajo real y ocurre el congelamiento). Una vez que todos los informes están listos, el código de creación del informe muestra una ventana (Listo) (Listo). Cerrar esta ventana habilita todo en la ventana principal, permitiendo a los usuarios salir del programa o cree más informes.

Agregado 20181129: a intervalos aparentemente aleatorios (con varios segundos de separación) puedo mover la ventana.

Excepto para mostrar la ventana "Listo", el código de creación del informe no involucra la GUI o tkinter de ninguna manera.

Algunos datos producidos por el código de creación del informe deben aparecer en la ventana "Listo".

No hay ninguna razón para "paralelizar" la creación de informes, especialmente porque se utiliza el mismo servidor SQL y base de datos para crear todos los informes.

En caso de que afecte a la solución: eventualmente necesitaré mostrar los nombres de los informes (ahora se muestran en la consola) en la GUI a medida que se crea cada informe.

Primera vez haciendo subprocesos / subprocesos con python pero estoy familiarizado con ambos desde otros idiomas.

Añadido 20181129: El entorno de desarrollo es Python 3.6.4 de 64 bits en Win 10 usando Eclipse Oxygen (complemento pydev). La aplicación debe ser portátil al menos para Linux.

La respuesta más simple parece ser usar hilos. Solo se necesita un hilo adicional (el que crea los informes). La línea afectada:

DoChosenReports()  # creates all reports (and the "Done" window)

cuando cambió a:

from threading import Thread

CreateReportsThread = Thread( target = DoChosenReports )
CreateReportsThread.start()
CreateReportsThread.join()  # 20181130: line omitted in original post, comment out to unfreeze GUI 

produce con éxito los informes con sus nombres que se muestran en la consola a medida que se crean.
Sin embargo, la GUI permanece congelada y la ventana "Listo" (ahora invocada por el nuevo hilo) nunca aparece. Esto deja al usuario en el limbo, no se puede hacer nada y preguntándome qué pasó, si es que sucedió algo (por eso quiero mostrar los nombres de archivo en la GUI a medida que se crean).

BTW, una vez que los informes están listos, el hilo de creación de informes debe suicidarse silenciosamente antes (o después) de que se muestre la ventana Listo.

Traté de usar

from multiprocessing import Process

ReportCreationProcess = Process( target = DoChosenReports )
ReportCreationProcess.start()

pero eso cayó en conflicto con los programas principales "if (__name__ == '__main__):'" test.

Añadido 20181129: acabo de descubrir el método de widget universal "variable de espera" (verhttp: //infohost.nmt.edu/tcc/help/pubs/tkinter/web/universal.htm). La idea básica es lanzar el código de creación de informe como un subproceso para siempre (¿daemon?) Controlado por este método (con la ejecución controlada por el botón "Hacer informes" en la GUI).

Desde la investigación web, sé que todas las acciones de tkinter deben realizarse desde el hilo principal (principal), lo que significa que debo mover la ventana "Listo" a ese hilo.
También necesito esa ventana para mostrar algunos datos (tres cadenas) que recibe del hilo "secundario". Estoy pensando en usar el uso de globales de nivel de aplicación como semáforos (solo escritos por el hilo de creación de informes y solo leídos por el programa principal) para pasar los datos. Soy consciente de que esto puede ser arriesgado con más de dos subprocesos, pero hacer algo más (por ejemplo, ¿usar colas?) Para mi situación simple parece excesivo.

Para resumir ¿Cuál es la forma más fácil de permitir que el usuario manipule (mueva, cambie el tamaño, minimice, etc.) la ventana principal de una aplicación mientras la ventana está congelada por cualquier motivo. En otras palabras, el O / S, no tkinter, debe controlar el marco (fuera) de la ventana principal.
La respuesta debe funcionar en Python 3.2.2+ de forma multiplataforma (al menos en Windows y Linux)

Respuestas a la pregunta(3)

Su respuesta a la pregunta