Gelage/suspension de l'interface graphique de tkinter en attendant la fin du thread
Un problème courant lors de l'utilisation de la boîte à outils de l'interface graphique de tkinter en Python est rencontré une interface gelée ou suspendue lors de l’exécution de certaines opérations. Cela est souvent dû à l'utilisation d'opérations de blocage, telles que la jonction de threads, dans la boucle d'événements principale.
Comprendre la boucle principale tkinter
La boucle principale tkinter() est responsable de la gestion des entrées des utilisateurs et de la mise à jour de l'interface graphique. Il s'exécute en continu dans un seul thread, recevant et traitant les événements. Toute opération qui bloque la boucle principale, comme attendre la fin d'un thread, peut empêcher l'interface graphique de répondre.
Solution : Utilisation de la méthode After pour les tâches asynchrones
Pour éviter de bloquer la boucle principale, envisagez d'utiliser la méthode after(), qui permet de planifier l'exécution de tâches à des intervalles spécifiques. En interrogeant périodiquement une file d'attente ou en effectuant d'autres tâches en arrière-plan, vous pouvez vous assurer que l'interface graphique reste réactive.
Séparation de l'interface graphique et des tâches asynchrones
Pour implémenter cela, séparez la logique GUI de la tâche asynchrone. Créez une classe qui gère l'interface graphique, en traitant les messages d'une file d'attente dans une méthode after() régulièrement planifiée. Dans un autre thread, exécutez la tâche asynchrone et remplissez la file d'attente avec les messages selon vos besoins.
Exemple de code
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()
Ce code montre comment séparer la logique de l'interface graphique de la tâche asynchrone, garantissant que l'interface graphique reste réactive pendant que la tâche s'exécute en arrière-plan.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3