Python Pyqt5多線程更新UI代碼實例(防止界面卡死)
"""
在編寫GUI界面中,通常用會有一些按鈕,點擊后觸發(fā)事件,
比如去下載一個文件或者做一些操作,
這些操作會耗時,如果不能及時結(jié)束,主線程將會阻塞,
這樣界面就會出現(xiàn)未響應(yīng)的狀態(tài),因此必須使用多線程來解決這個問題。
"""
代碼實例
from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,QMutex,pyqtSignal) import sys import time qmut_1 = QMutex() # 創(chuàng)建線程鎖 qmut_2 = QMutex() qmut_3 = QMutex() # 繼承QThread class Thread_1(QThread): # 線程1 def __init__(self): super().__init__() def run(self): qmut_1.lock() # 加鎖 values = [1, 2, 3, 4, 5,6,7,8,9,10] print("==== Thread_1 ====") for i in values: print("Thread_1:",i) time.sleep(0.5) # 休眠 qmut_1.unlock() # 解鎖 class Thread_2(QThread): # 線程2 _signal =pyqtSignal() def __init__(self): super().__init__() def run(self): # qmut_2.lock() # 加鎖 values = ["a", "b", "c", "d", "e","f","g","h","i","j","k"] print("==== Thread_2 ====") for i in values: print("Thread_2:",i) time.sleep(0.5) # qmut_2.unlock() # 解鎖 self._signal.emit() class Thread_3(QThread): # 線程2 _signal =pyqtSignal() def __init__(self): super().__init__() def run(self): qmut_3.lock() # 加鎖 values = ["a", "b", "c", "d", "e","f","g","h","i","j","k"] print("==== Thread_3 ====") for i in values: print("Thread_3:",i) time.sleep(0.5) qmut_3.unlock() # 解鎖 self._signal.emit() #執(zhí)行完畢后,釋放信號 class Thread_01(QThread): # 線程1 def __init__(self): super().__init__() def run(self): values = [1, 2, 3, 4, 5] print("==== Thread_01 ====") for i in values: print("Thread_01:",i) time.sleep(0.5) # 休眠 class Thread_02(QThread): # 線程2 def __init__(self): super().__init__() def run(self): values = ["a", "b", "c", "d", "e"] print("==== Thread_02 ====") for i in values: print("Thread_02:",i) time.sleep(0.5) class MyWin(QWidget): def __init__(self): super().__init__() # 按鈕初始化 self.btn_01 = QPushButton('按鈕_每點一次運行一次', self) self.btn_01.move(80, 40) self.btn_01.clicked.connect(self.click_01) # 綁定槽函數(shù) self.btn_02 = QPushButton('按鈕_每點一次運行一次', self) self.btn_02.move(80, 80) self.btn_02.clicked.connect(self.click_02) # 綁定槽函數(shù) self.btn_1 = QPushButton('按鈕_線程鎖_多次點擊,依次執(zhí)行(滯后感)', self) self.btn_1.move(80, 120) self.btn_1.clicked.connect(self.click_1) # 綁定槽函數(shù) self.btn_2 = QPushButton('按鈕_線程鎖_收到完成信號后才能再次點擊', self) self.btn_2.move(80, 160) self.btn_2.clicked.connect(self.click_2) # 綁定槽函數(shù) self.btn_3 = QPushButton('按鈕_線程鎖_收到完成信號后再次執(zhí)行', self) self.btn_3.move(80, 200) self.btn_3.clicked.connect(self.click_3) # 綁定槽函數(shù) def click_01(self): self.thread_01 = Thread_01() # 創(chuàng)建線程 self.thread_01.start() # 開始線程 def click_02(self): self.thread_02 = Thread_02() # 創(chuàng)建線程 self.thread_02.start() # 開始線程 def click_1(self): self.thread_1 = Thread_1() # 創(chuàng)建線程 self.thread_1.start() # 開始線程 def click_2(self): self.btn_2.setEnabled(False) self.thread_2 = Thread_2() self.thread_2._signal.connect(self.set_btn_2) #信號連接,如果收到信號,就執(zhí)行對應(yīng)的函數(shù) self.thread_2.start() def click_3(self): self.btn_3.setEnabled(False) self.thread_3 = Thread_3() self.thread_3._signal.connect(self.set_btn_3) #信號連接,如果收到信號,就執(zhí)行對應(yīng)的函數(shù) self.thread_3.start() def set_btn_2(self): self.btn_2.setEnabled(True) def set_btn_3(self): self.btn_3.setEnabled(True) if __name__ == "__main__": app = QApplication(sys.argv) myshow = MyWin() myshow.setWindowTitle("多線程演示") myshow.setMinimumHeight(500) myshow.setMinimumWidth(500) myshow.show() sys.exit(app.exec_())
運行結(jié)果
====? ? ?Thread_01? ? ? ?====
Thread_01: 1
Thread_01: 2
Thread_01: 3
Thread_01: 4
Thread_01: 5
====? ? ?Thread_02? ? ? ?====
Thread_02: a
Thread_02: b
Thread_02: c
Thread_02: d
Thread_02: e
====? ? ?Thread_1? ? ====
Thread_1: 1
Thread_1: 2
Thread_1: 3
Thread_1: 4
Thread_1: 5
Thread_1: 6
Thread_1: 7
Thread_1: 8
Thread_1: 9
====? ? ?Thread_2? ? ====
Thread_2: a
Thread_1: 10
Thread_2: b
Thread_2: c
Thread_2: d
====? ? ?Thread_3? ? ====
Thread_3: a
Thread_2: e
Thread_3: b
Thread_2: f
Thread_3: c
Thread_2: g
Thread_3: d
Thread_2: h
Thread_3: e
Thread_2: i
Thread_3: f
Thread_2: j
Thread_3: g
Thread_2: k
Thread_3: h
運行過程
到此這篇關(guān)于Python Pyqt5多線程更新UI代碼實例(防止界面卡死)的文章就介紹到這了,更多相關(guān)Python Pyqt5多線程更新U內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Pandas對csv文件進行數(shù)據(jù)處理的方法
這篇文章主要介紹了Python使用Pandas對csv文件進行數(shù)據(jù)處理的方法,本文通過實例代碼相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08Python和JS反爬之解決反爬參數(shù)?signKey
這篇文章主要介紹了Python和JS反爬之解決反爬參數(shù)?signKey,Python?反爬中有一大類,叫做字體反爬,核心的理論就是通過字體文件或者?CSS?偏移,接下來文章的詳細(xì)介紹,需要的小伙伴可以參考一下2022-05-05詳解向scrapy中的spider傳遞參數(shù)的幾種方法(2種)
這篇文章主要介紹了詳解向scrapy中的spider傳遞參數(shù)的幾種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09python快速建立超簡單的web服務(wù)器的實現(xiàn)方法
某些條件測試,需要一個簡單的web服務(wù)器測試一下,為此專門去配置個nginx 或者 apache服務(wù)器略顯麻煩,這里就為大家介紹一下使用python快速建立超簡單的web服務(wù)器的方法,需要的朋友可以參考下2018-02-02Python argparse模塊實現(xiàn)解析命令行參數(shù)方法詳解
argparse 是 python 自帶的命令行參數(shù)解析包,可以用來方便的服務(wù)命令行參數(shù)。本文將通過示例和大家詳細(xì)講講argparse的使用,需要的可以參考一下2022-09-09