python: While Loop hace que todo el progtwig se bloquee en Tkinter

Estoy intentando ejecutar un While Loop para hacer algo constantemente. Por el momento, todo lo que hace es bloquear mi progtwig.

Aquí está mi código:

import tkinter def a(): root = tkinter.Tk() canvas = tkinter.Canvas(root, width=800, height=600) while True: print("test") a() 

Recorrerá la statement de print , sin embargo, el canvas real se niega a abrir.

¿Hay algún bucle infinito viable que pueda funcionar junto con Tkinter?

Información adicional Cuando elimino la statement While True , el canvas vuelve a aparecer.

Tkinter se bloquea a menos que pueda ejecutar su propio bucle infinito, root.mainloop . Normalmente, no puede ejecutar su propio bucle infinito paralelo a Tkinter. Hay algunas estrategias alternativas, sin embargo:

Usar after

after es un método Tkinter que hace que la función de destino se ejecute después de un cierto tiempo. Puede hacer que una función se llame repetidamente invocándose a sí misma after .

 import tkinter #this gets called every 10 ms def periodically_called(): print("test") root.after(10, periodically_called) root = tkinter.Tk() root.after(10, periodically_called) root.mainloop() 

También hay root.after_idle , que ejecuta la función de destino tan pronto como el sistema no tiene más eventos para procesar. Esto puede ser preferible si necesita hacer un bucle más rápido que una vez por milisegundo.

Usar threading

El módulo de threading permite ejecutar dos piezas de código de Python en paralelo. Con este método, puedes hacer que dos bucles infinitos se ejecuten al mismo tiempo.

 import tkinter import threading def test_loop(): while True: print("test") thread = threading.Thread(target=test_loop) #make test_loop terminate when the user exits the window thread.daemon = True thread.start() root = tkinter.Tk() root.mainloop() 

Pero tenga cuidado: invocar métodos Tkinter desde cualquier subproceso que no sea el principal puede provocar un locking o provocar un comportamiento inusual.