Python Pyqt5多線程更新UI代碼實(shí)例(防止界面卡死)
"""
在編寫GUI界面中,通常用會(huì)有一些按鈕,點(diǎn)擊后觸發(fā)事件,
比如去下載一個(gè)文件或者做一些操作,
這些操作會(huì)耗時(shí),如果不能及時(shí)結(jié)束,主線程將會(huì)阻塞,
這樣界面就會(huì)出現(xiàn)未響應(yīng)的狀態(tài),因此必須使用多線程來解決這個(gè)問題。
"""
代碼實(shí)例
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('按鈕_每點(diǎn)一次運(yùn)行一次', self)
self.btn_01.move(80, 40)
self.btn_01.clicked.connect(self.click_01) # 綁定槽函數(shù)
self.btn_02 = QPushButton('按鈕_每點(diǎn)一次運(yùn)行一次', self)
self.btn_02.move(80, 80)
self.btn_02.clicked.connect(self.click_02) # 綁定槽函數(shù)
self.btn_1 = QPushButton('按鈕_線程鎖_多次點(diǎn)擊,依次執(zhí)行(滯后感)', self)
self.btn_1.move(80, 120)
self.btn_1.clicked.connect(self.click_1) # 綁定槽函數(shù)
self.btn_2 = QPushButton('按鈕_線程鎖_收到完成信號后才能再次點(diǎn)擊', 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_())
運(yùn)行結(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
運(yùn)行過程

到此這篇關(guān)于Python Pyqt5多線程更新UI代碼實(shí)例(防止界面卡死)的文章就介紹到這了,更多相關(guān)Python Pyqt5多線程更新U內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解PyQt5中Thread多線程的使用
- 詳解PyQt5 GUI 接收UDP數(shù)據(jù)并動(dòng)態(tài)繪圖的過程(多線程間信號傳遞)
- Pyqt5 實(shí)現(xiàn)多線程文件搜索的案例
- PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn)
- python GUI庫圖形界面開發(fā)之PyQt5多線程中信號與槽的詳細(xì)使用方法與實(shí)例
- 利用PyQt中的QThread類實(shí)現(xiàn)多線程
- PyQt5中多線程模塊QThread使用方法的實(shí)現(xiàn)
- PYQT5開啟多個(gè)線程和窗口,多線程與多窗口的交互實(shí)例
- PyQt 異步任務(wù)多線程的幾種方案示例詳解
相關(guān)文章
Python實(shí)現(xiàn)將目錄中TXT合并成一個(gè)大TXT文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將目錄中TXT合并成一個(gè)大TXT文件的方法,涉及Python針對目錄下文本文件的遍歷、讀取及寫入等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件
這篇文章主要介紹了python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件,通過準(zhǔn)備要打包的工程文件展開詳情,需要的小伙伴可以參考一下2022-05-05
Python?selenium?webdriver?基本使用代碼分享
這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下2022-11-11
Python類中使用cursor.execute()時(shí)語法錯(cuò)誤的解決方法
在 Python 類中使用 cursor.execute() 時(shí),出現(xiàn)語法錯(cuò)誤(如 SyntaxError 或 SQL 語法相關(guān)錯(cuò)誤)通常是因?yàn)?nbsp;SQL 語句格式不正確、占位符使用不當(dāng),或參數(shù)傳遞方式不符合預(yù)期,以下是解決此類問題的常見方法和建議,需要的朋友可以參考下2024-09-09
Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼
這篇文章主要介紹了Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06

