Congelar/colgar la GUI de tkinter a la espera de que se complete el hilo
Se encuentra un problema común al trabajar con el kit de herramientas de la GUI de tkinter en Python una interfaz congelada o suspendida al realizar ciertas operaciones. Esto a menudo se debe al uso de operaciones de bloqueo, como unir subprocesos, dentro del bucle de eventos principal.
Comprensión del bucle principal de tkinter
El bucle principal de tkinter() es responsable de manejar la entrada del usuario y actualizar la GUI. Se ejecuta continuamente en un solo hilo, recibiendo y procesando eventos. Cualquier operación que bloquee el bucle principal, como esperar a que se complete un subproceso, puede hacer que la GUI deje de responder.
Solución: uso del método After para tareas asincrónicas
Para evitar bloquear el bucle principal, considere usar el método after(), que permite programar tareas para que se ejecuten en intervalos específicos. Al sondear periódicamente una cola o realizar otras tareas en segundo plano, puede asegurarse de que la GUI siga respondiendo.
Separación de GUI y tareas asincrónicas
Para implementar esto, separe la lógica de la GUI de la tarea asincrónica. Cree una clase que maneje la GUI y procese mensajes de una cola dentro de un método after() programado regularmente. En otro hilo, ejecute la tarea asincrónica y complete la cola con mensajes según sea necesario.
Código de ejemplo
from threading import Thread
from queue import Queue
import tkinter as tk
class GuiPart:
def __init__(self, master, queue):
self.queue = queue
# Set up GUI elements here
def process_incoming(self):
while not self.queue.empty():
message = self.queue.get()
# Process and handle the message here
class AsynchronousTask:
def __init__(self, queue):
self.queue = queue
def run(self):
# Perform asynchronous task here
# Put messages into the queue as needed
def start_gui():
root = tk.Tk()
queue = Queue()
gui = GuiPart(root, queue)
async_task = AsynchronousTask(queue)
# Start the asynchronous task in a separate thread
t = Thread(target=async_task.run)
t.start()
# Start the GUI mainloop
root.mainloop()
if __name__ == "__main__":
start_gui()
Este código demuestra cómo separar la lógica de la GUI de la tarea asincrónica, asegurando que la GUI siga respondiendo mientras la tarea se ejecuta en segundo plano.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3