Maison >développement back-end >Tutoriel Python >Comment empêcher le gel de l'interface graphique de Tkinter en attendant la fin des threads ?
Lorsqu'un bouton d'une interface graphique de Tkinter est enfoncé, l'interface se bloque souvent. Malgré l'utilisation du threading, le problème persiste. En tirant parti des conseils du Python Cookbook, voici une solution pour maintenir la réactivité de l'interface graphique lors de l'exécution d'une tâche asynchrone :
Le principal coupable du gel de l'interface graphique est l'utilisation de join( ) sur un fil de discussion en arrière-plan. Pour éviter cela, une meilleure approche consiste à mettre en œuvre un mécanisme de « sondage ».
La méthode universelle after() de Tkinter permet une surveillance continue d'une file d'attente à intervalles réguliers. Cela permet à l'interface graphique de rester réactive en attendant la fin du thread.
Le code suivant illustre cette approche :
<code class="python">import Tkinter as tk import threading import queue # Create a queue for communication queue = queue.Queue() # Define the GUI portion class GuiPart(object): def __init__(self, master, queue): # Set up the GUI tk.Button(master, text='Done', command=self.end_command).pack() def processIncoming(self): while not queue.empty(): # Handle incoming messages here def end_command(self): # Perform necessary cleanup and exit # Define the threaded client class ThreadedClient(object): def __init__(self, master): # Set up GUI and thread self.gui = GuiPart(master, queue) self.thread = threading.Thread(target=self.worker_thread) self.thread.start() # Start periodic checking of the queue self.periodic_call() def periodic_call(self): self.gui.processIncoming() master.after(200, self.periodic_call) def worker_thread(self): # Perform asynchronous I/O tasks here, adding messages to the queue # Main program root = tk.Tk() client = ThreadedClient(root) root.mainloop()</code>
Dans cet exemple, la communication entre l'interface graphique et un thread d'arrière-plan sont gérés via une file d'attente, permettant une exécution asynchrone sans geler l'interface graphique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!