Apabila mereka bentuk aplikasi GUI, adalah penting untuk mengekalkan responsif UI semasa melaksanakan tugas yang memakan masa. Tkinter, perpustakaan GUI Python yang popular, menyediakan keupayaan multithreading untuk menghalang gelung acara utama daripada disekat.
Masalah:
Pertimbangkan senario dengan butang "Mula" dan a Progressbar. Tingkah laku yang diingini ialah:
Tetapi masalahnya timbul: GUI membeku selama 5 saat sebelum Progressbar muncul. Ini kerana utas utama disekat oleh tugas yang memakan masa.
Asas Thread:
Untuk menangani perkara ini, kami menggunakan multithreading. Benang membenarkan berbilang tugasan dijalankan serentak, menghalang GUI daripada membeku. Walau bagaimanapun, adalah penting untuk menggunakan utas dengan berkesan untuk mengelakkan gangguan dengan utas utama.
Penyelesaian menggunakan Kelas Berasingan:
Dalam kes ini, kita boleh mencipta kelas berasingan untuk mengendalikan tugas yang memakan masa dan berkomunikasi dengan GUI melalui baris gilir. Benang utama akan menyemak baris gilir secara berkala untuk mendapatkan hasil. Pendekatan ini membolehkan GUI kekal responsif semasa tugasan dijalankan dalam urutan yang berbeza.
Pelaksanaan Kod:
import queue class GUI: # ... def tb_click(self): self.progress() self.prog_bar.start() self.queue = queue.Queue() ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) def process_queue(self): try: msg = self.queue.get_nowait() # Show result of the task if needed self.prog_bar.stop() except queue.Empty: self.master.after(100, self.process_queue) class ThreadedTask(threading.Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): time.sleep(5) # Simulate long running process self.queue.put("Task finished")
Pertimbangan:
Atas ialah kandungan terperinci Bagaimanakah Tkinter Multithreading Dapat Menghalang Pembekuan GUI Semasa Tugasan Berlangsung Lama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!