Pengenalan:
Apabila mereka bentuk antara muka pengguna grafik (GUI) menggunakan Tkinter, memastikan tindak balas adalah penting. Satu isu biasa yang dihadapi ialah gelung acara utama menjadi tidak bertindak balas atau "membeku" semasa melaksanakan tugasan yang berjalan lama. Ini boleh berlaku apabila utas utama dibebani dengan tugasan yang menyekat gelung peristiwa, menghalangnya daripada mengendalikan input pengguna.
Benang untuk Operasi Tidak Menyekat:
Pembacaan Berbilang ialah teknik yang membolehkan berbilang tugasan dijalankan serentak dalam satu atur cara. Dengan menggunakan urutan, aplikasi GUI boleh melakukan operasi yang memakan masa tanpa mengganggu tindak balas gelung acara utama.
Senario Kes:
Dalam GUI anda dengan butang "Mula" dan bar kemajuan, isu timbul apabila bar kemajuan terhenti selama 5 saat selepas butang diklik. Ini kerana urutan utama diduduki oleh fungsi tidur, menyekat gelung acara daripada mengendalikan acara lain.
Menggunakan Kelas Berasingan untuk Logik:
Untuk mengurangkan perkara ini masalah, anda mempertimbangkan untuk memisahkan logik ke dalam kelas yang berbeza dan menggunakan ia daripada kelas GUI utama. Walaupun ini secara amnya merupakan amalan yang baik untuk merangkum fungsi, ia memerlukan penyelarasan yang teliti antara kelas untuk memastikan komunikasi yang betul.
Melaksanakan Penyelesaian Berasaskan Benang:
Sebaliknya memisahkan logik ke dalam kelas, pertimbangkan untuk melaksanakan penyelesaian berasaskan benang dalam kelas GUI utama. Begini cara anda boleh mencapai ini:
class GUI: # ... def tb_click(self): self.progress() self.prog_bar.start() # Create a Queue to communicate between threads self.queue = queue.Queue() # Start a thread with access to the Queue ThreadedTask(self.queue).start() # Check the Queue periodically in the main thread self.master.after(100, self.process_queue)
Dalam penyelesaian ini, kelas ThreadedTask ialah subkelas threading.Thread yang melaksanakan tugas yang memakan masa. Ia berkomunikasi dengan utas utama melalui Baris Gilir, yang bertindak sebagai penimbal untuk data.
Memproses Keputusan:
Untuk memproses hasil tugasan, perkara utama benang kerap menyemak Baris Gilir menggunakan after(). Apabila data diterima, bar kemajuan boleh dihentikan.
class ThreadedTask(threading.Thread): def run(self): time.sleep(5) # Simulate long running process self.queue.put("Task finished")
Kesimpulan:
Dengan menggunakan benang dengan cara ini, anda boleh menghalang gelung acara utama daripada membeku semasa melakukan tugasan yang berjalan lama. Baris Gilir menyediakan mekanisme yang mudah untuk komunikasi antara utas, memastikan responsif GUI kepada input pengguna.
Atas ialah kandungan terperinci Bagaimanakah Threading Dapat Menghalang Gelung Peristiwa Utama Tkinter daripada Tergendala Semasa Tugasan Berlangsung Lama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!