Saltar al contenido

Subprocesamiento múltiple en Tkinter GUI, subprocesos en diferentes clases

Encontramos la solución a este inconveniente, o por lo menos eso esperamos. Si presentas inquietudes coméntalo, para nosotros será un gusto responderte

Solución:

No necesitas enhebrar para algo tan simple.

La GUI se congela porque está poniendo un time.sleep dentro de la función que bloquea el hilo principal hasta que finaliza.

Simplemente use el integrado de Tk after método. Cambie su función a.

def countNum(self, num=0):
    if num < 10:
        print num
        root.after(2000, lambda: self.countNum(num + 1))
    else:
        print "Stopping after call"

El after método toma los siguientes argumentos:

after(delay_ms, callback, arguments)

El tiempo está en milisegundos, y 1000 ms = 1 segundo. Entonces, pasamos 2000 ms por un retraso de 2 segundos.

La respuesta de Pythonista es excelente. Pero me gustaría tocar algunos puntos adicionales.

  • Las GUI son evento conducido. Se ejecutan en un ciclo de procesamiento de eventos, llamando partes de su código (llamadas devoluciones de llamada) de vez en cuando. Entonces, su código es más o menos un invitado en el bucle de eventos. Como habrá notado, sus fragmentos de código deberían terminar rápidamente; de ​​lo contrario, detendrían el procesamiento de eventos y la GUI no respondería. Este es un modelo de programación completamente diferente de los programas lineales que a menudo se ven en los tutoriales. Para realizar cálculos o tareas de mayor duración, puede dividirlos en partes pequeñas y usar after. O podrías hacerlo en otro proceso con multiprocessing. Pero aún necesitaría verificar periódicamente (con after otra vez) si han terminado.

Los siguientes puntos se derivan del hecho de que hacer multiproceso correctamente es duro.

  • CPython (la implementación de Python más utilizada) tiene lo que se llama un bloqueo de intérprete global. Esto asegura que sólo un hilo a la vez puede estar ejecutando el código de bytes de Python. Cuando otros subprocesos están ocupados ejecutando el código de bytes de Python, el subproceso que ejecuta la GUI no hace nada. Por lo tanto, los subprocesos múltiples no son una solución segura para el problema de una GUI que no responde.

  • muchos kits de herramientas GUI no son seguros para subprocesos, y tkinter no es una excepción. Esto significa que usted debe solo hacer llamadas tkinter desde el subproceso que ejecuta el mainloop. (En Python 3.x, tkinter se ha hecho seguro para subprocesos).

Te mostramos las reseñas y valoraciones de los lectores

Tienes la opción de estimular nuestra ocupación dejando un comentario y valorándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *