PyQt 異步任務(wù)多線程的幾種方案示例詳解
多線程異步線程是我們常用的,如我們?cè)趫?zhí)行耗時(shí)操作,又不想卡用主程序 ;
1. QThread
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
import time
class WorkerThread(QThread):
progress = pyqtSignal(int) # 定義信號(hào)
def __init__(self,main_instance):
QThread.__init__(self)
self.main_instance = main_instance
def run(self):
for i in range(1, 101):
self.main_instance.excuteSomeThing()
self.progress.emit(i) # 發(fā)送信號(hào)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(800, 600)
self.initUI()
def initUI(self):
self.label = QLabel("進(jìn)度: 0")
self.button = QPushButton("開始任務(wù)")
self.button.clicked.connect(self.start_task)
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)
def excuteSomeThing(self):
time.sleep(0.1) # 模擬耗時(shí)操作
def start_task(self):
self.worker = WorkerThread(self)
self.worker.progress.connect(self.update_label) # 連接信號(hào)到槽函數(shù)
self.worker.start() # 啟動(dòng)線程
def update_label(self, value):
self.label.setText(f"進(jìn)度: {value}")
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()子線程中回調(diào)主線程函數(shù)執(zhí)行,在子線程;
2. QThreadPool
from PyQt5.QtCore import QRunnable, QThreadPool, pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
import time
class WorkerSignals(QObject):
progress = pyqtSignal(int)
class Worker(QRunnable):
def __init__(self):
super().__init__()
self.signals = WorkerSignals()
def run(self):
for i in range(1, 101):
time.sleep(0.01) # 模擬耗時(shí)操作
self.signals.progress.emit(i) # 發(fā)送信號(hào)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(800, 600)
self.initUI()
self.thread_pool = QThreadPool()
def initUI(self):
self.label = QLabel("進(jìn)度: 0")
self.button = QPushButton("開始任務(wù)")
self.button.clicked.connect(self.start_task)
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)
def start_task(self):
worker = Worker()
worker.signals.progress.connect(self.update_label)
self.thread_pool.start(worker)
def update_label(self, value):
self.label.setText(f"進(jìn)度: {value}")
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()3.concurrent
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QPushButton
from concurrent.futures import ThreadPoolExecutor
import time
class Worker(QObject):
progress = pyqtSignal(int)
def do_work(self):
for i in range(1, 101):
time.sleep(0.021) # 模擬耗時(shí)操作
self.progress.emit(i)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.resize(800, 600)
self.initUI()
self.executor = ThreadPoolExecutor(max_workers=10)
def initUI(self):
self.label = QLabel("進(jìn)度: 0")
self.button = QPushButton("開始任務(wù)")
self.button.clicked.connect(self.start_task)
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.button)
self.setLayout(layout)
def start_task(self):
self.worker = Worker()
self.worker.progress.connect(self.update_label)
self.executor.submit(self.worker.do_work)
def update_label(self, value):
self.label.setText(f"進(jìn)度: {value}")
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()總結(jié)
QThread:適合需要自定義線程邏輯的場景。QRunnable + QThreadPool:適合輕量級(jí)、高并發(fā)任務(wù)。concurrent.futures:簡單結(jié)合信號(hào)與槽機(jī)制使用線程池。
到此這篇關(guān)于PyQt 異步任務(wù)多線程的幾種方案示例詳解的文章就介紹到這了,更多相關(guān)PyQt 多線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解PyQt5中Thread多線程的使用
- Python Pyqt5多線程更新UI代碼實(shí)例(防止界面卡死)
- 詳解PyQt5 GUI 接收UDP數(shù)據(jù)并動(dòng)態(tài)繪圖的過程(多線程間信號(hào)傳遞)
- Pyqt5 實(shí)現(xiàn)多線程文件搜索的案例
- PyQt5多線程防卡死和多窗口用法的實(shí)現(xiàn)
- python GUI庫圖形界面開發(fā)之PyQt5多線程中信號(hào)與槽的詳細(xì)使用方法與實(shí)例
- 利用PyQt中的QThread類實(shí)現(xiàn)多線程
- PyQt5中多線程模塊QThread使用方法的實(shí)現(xiàn)
- PYQT5開啟多個(gè)線程和窗口,多線程與多窗口的交互實(shí)例
相關(guān)文章
OpenCV學(xué)習(xí)方框?yàn)V波實(shí)現(xiàn)圖像處理代碼示例
這篇文章主要為大家介紹了OpenCV學(xué)習(xí)如何使用方框?yàn)V波實(shí)現(xiàn)對(duì)圖像處理代碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
Python編譯結(jié)果之code對(duì)象與pyc文件詳解
今天小編就為大家分享一篇對(duì)Python編譯結(jié)果之code對(duì)象與pyc文件的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-10-10
Matplotlib繪圖基礎(chǔ)之坐標(biāo)軸詳解
Matplotlib的坐標(biāo)軸是用于在繪圖中表示數(shù)據(jù)的位置的工具,也是為了幫助觀察者了解圖像中數(shù)據(jù)的位置和大小,下面小編就來和大家詳細(xì)聊聊Matplotlib繪圖時(shí)坐標(biāo)軸的具體使用吧2023-07-07
詳解pandas映射與數(shù)據(jù)轉(zhuǎn)換
這篇文章主要介紹了pandas映射與數(shù)據(jù)轉(zhuǎn)換的相關(guān)資料,幫助大家更好的利用python進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下2021-01-01
Numpy數(shù)組的轉(zhuǎn)置和軸交換的實(shí)現(xiàn)
本文主要介紹了Numpy數(shù)組的轉(zhuǎn)置和軸交換的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
Python 最強(qiáng)編輯器詳細(xì)使用指南(PyCharm )
這篇文章主要介紹了Python 最強(qiáng)編輯器詳細(xì)使用指南(PyCharm),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Python中實(shí)現(xiàn) xls 文件轉(zhuǎn) xlsx的4種方法(示例詳解)
在 Python 中,可以采用 pandas、pyexcel、win32com 和 xls2xlsx 這四個(gè)模塊,實(shí)現(xiàn) xls 轉(zhuǎn) xlsx 格式,本文以 Excel 示例文件test_Excel.xls 為例結(jié)合示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06
利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式
今天小編就為大家分享一篇利用python實(shí)現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01

