La ventana de Tkinter dice (no responde) pero el código se está ejecutando

Tengo un progtwig que ejecuta un proceso largo después de hacer clic en un botón de acción. A medida que el proceso se ejecuta, la ventana raíz dirá que no responde aunque sé que el progtwig se ejecuta en segundo plano. Este progtwig se lanzará a algunas personas con las que trabajo y quiero asegurarme de que no se asusten y cierren la ventana cuando vean esto. La solución que tengo es colocar un root.update en el bucle del proceso que se está ejecutando, pero no estoy seguro de que esta sea la mejor solución.

Usando el python 3.3

Aquí hay una muestra del código para que tengas una idea de lo que estoy haciendo, esto se llama desde el bucle principal:

def combine(boxes_to, boxes_from, frame): to_value,to_pos = gui.checkBoxes(boxes_to) from_value,from_pos = gui.checkBoxes(boxes_from) frame.destroy() running = Label(root,text="Running please do not close..",font = (16)) running.pack() root.update() map_to = open("map_to",'r') for line in map_to: root.update() process(line) running.destroy() map_to.close() finish = Button(root, text="Done",command=gui.stop) finish.pack() 

Si bien puede llamar a root.update () en su bucle, esto todavía producirá algunos efectos secundarios (potencialmente) indeseables.

  1. El progtwig puede actuar con lentitud, lo que significa que lleva mucho tiempo responder a las opiniones del usuario.
  2. Solo podrás ejecutar esta acción. Cualquier otra acción tiene que esperar a que esto termine.

Como alternativa, sugiero que implemente subprocesos múltiples simples. Python multithreading es bastante simple, y evitará estos dos inconvenientes. Podrá ejecutar su código de ejecución prolongada, mientras sigue brindando una interfaz de usuario limpia y con capacidad de respuesta.

Si su aplicación es trivialmente paralelizable, podría usar múltiples hilos para disminuir el tiempo de ejecución. Ex. El subproceso 1 controla las entradas 1-100, mientras que el subproceso 2 controla las entradas 101-200.