es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo salgo limpiamente de mi aplicación de Python3 desde el bucle de eventos asyncio run_forever() cuando el usuario hace clic en la casilla de cierre de la ventana raíz de tkinter?

Estoy intentando hacer una aplicación python3 para mi Raspberry Pi 4B y tengo las ventanas tkinter funcionando bien, pero necesito agregar manejo asíncrono para permitir que los widgets de tkinter respondan mientras se procesan acciones asíncronas iniciadas por los widgets de la ventana.

El código de prueba está usando asyncio y tkinter. Sin embargo, sin root.mainloop() debido a que bucle de run_forever() de asyncio se llama al final. La idea es que cuando el usuario haga clic en la caja de cierre de la ventana principal, se llame a RequestQuit() para establecer el indicador quitRequested y luego, cuando el control regrese al bucle de eventos, root.after_idle(AfterIdle) haría que se llame a AfterIdle, donde se verifica la bandera y si es verdadera, el bucle de eventos se detiene, o si falla, la aplicación se cierra con exit(0).

El protocolo WM_DELETE_WINDOW de loop RequestQuit de alguna manera no se llama cuando el usuario hace clic en la caja de cierre de la ventana principal, por lo que el bucle de eventos AfterIdle nunca recibe la bandera para salir y tengo que matar la aplicación abandonando XQuartz.

Estoy usando ssh a través de Terminal en MacOS X Big Sur 11.5.2, conectado a una Raspberry Pi 4B con Python 3.7.3.

¿Qué me he perdido aquí?

(No he incluido los widgets o sus controladores o el procesamiento asíncrono aquí, por brevedad, ya que no son parte del problema en cuestión.)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la corrutina del protocolo WM_DELETE_WINDOW llamada RequestQuit no está siendo llamada cuando el usuario hace clic en la x de cierre de la ventana principal. Esto puede deberse a un problema con el bucle de eventos que no maneja adecuadamente el protocolo.

    Una solución potencial podría ser intentar utilizar la función run_until_complete() en lugar de run_forever() en el bucle principal. Esto podría ayudar a garantizar que todas las corrutinas, incluido el protocolo WM_DELETE_WINDOW, se manejen adecuadamente antes de salir del bucle.

    Otra opción podría ser verificar si la ventana principal se está destruyendo dentro de la corrutina AfterIdle, ya que esto podría estar causando que la bandera QuitRequested no se detecte correctamente.

    También puede valer la pena verificar si alguna otra parte del código podría estar causando conflictos o comportamientos inesperados, como el uso de otros bucles de eventos o bibliotecas.

    En general, podría ser necesario más información y depuración para determinar la causa exacta del problema y encontrar la mejor solución.

Comments are closed.