Python中的并發編程(5)PyQt 多線程

PyQt 多線程

1 卡住的計時器

我們定義了一個計時器,每秒鐘更新一次顯示的數字。此外我們定義了一個耗時5秒的任務oh_no,和按鈕“危險”綁定。

當我們點擊“危險”按鈕時,程序去執行oh_no,導致顯示停止更新了。
卡住

import sys
import time
from PyQt6.QtCore import QTimer
from PyQt6.QtWidgets import (QApplication,QLabel,QMainWindow,QPushButton,QVBoxLayout,QWidget,
)class MainWindow(QMainWindow):def __init__(self):super().__init__()self.counter = 0layout = QVBoxLayout()self.l = QLabel("Start")b = QPushButton("DANGER!")b.pressed.connect(self.oh_no)layout.addWidget(self.l)layout.addWidget(b)w = QWidget()w.setLayout(layout)self.setCentralWidget(w)self.show()# 定時器,每1秒更新一次文本self.timer = QTimer()self.timer.setInterval(1000)self.timer.timeout.connect(self.recurring_timer)self.timer.start()def oh_no(self):time.sleep(5)def recurring_timer(self):self.counter += 1self.l.setText("Counter: %d" % self.counter)app = QApplication(sys.argv)
window = MainWindow()
app.exec()

QT提供了線程的接口,主要通過兩個類實現
QRunnable: 工作的容器
QThreadPool:線程池

繼承QRunnable并實現run方法:

class Worker(QRunnable):"""Worker thread"""@pyqtSlot()def run(self):"""Your code goes in this function"""print("Thread start")time.sleep(5)print("Thread complete")

創建線程池:

class MainWindow(QMainWindow):def __init__(self):super().__init__()self.threadpool = QThreadPool()print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount())

使用線程池啟動任務:

def oh_no(self):worker = Worker()self.threadpool.start(worker)

使用線程后,當我們點擊危險時會啟動額外的線程去執行任務,不會阻塞Qt的顯示。
不卡了

2 進度條

當我們執行一個耗時的任務時,常見的做法是添加一個進度條來讓用戶了解任務的進度。

為此,我們需要在任務中發送進度信息,然后在Qt窗口中更新進度。
進度條

1.導入相關庫

import sys
import time
from PyQt6.QtCore import QObject, QRunnable, QThreadPool, QTimer,\pyqtSignal, pyqtSlot
from PyQt6.QtWidgets import (QApplication,QLabel,QMainWindow,QProgressBar,QPushButton,QVBoxLayout,QWidget,
)

2.在任務中使用信號量發送進度

# 信號量,用于表示進度
class WorkerSignals(QObject):progress = pyqtSignal(int)class Worker(QRunnable):def __init__(self):super().__init__()self.signals = WorkerSignals()@pyqtSlot()def run(self):total_n = 1000for n in range(total_n):progress_pc = int(100 * float(n + 1) / total_n) #Progress 0-100% as intself.signals.progress.emit(progress_pc) # 通過信號發送當前進度值time.sleep(0.01)  

3.在窗口中接收信號,并在進度條中顯示

class MainWindow(QMainWindow):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)layout = QVBoxLayout()self.progressbar = QProgressBar() # 進度條button = QPushButton("啟動")button.pressed.connect(self.execute)layout.addWidget(self.progressbar)layout.addWidget(button)w = QWidget()w.setLayout(layout)self.setCentralWidget(w)self.show()self.threadpool = QThreadPool()print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount())def execute(self):worker = Worker()# 和update_progress連接,worker.signals.progress.connect(self.update_progress)# Executeself.threadpool.start(worker)# 接收progress信號,并顯示def update_progress(self, progress_value):self.progressbar.setValue(progress_value)    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39178.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Aspose.PDF功能演示:在程序中合并 JPG 文件

Aspose.PDF 是一款高級PDF處理API,可以在跨平臺應用程序中輕松生成,修改,轉換,呈現,保護和打印文檔。無需使用Adobe Acrobat。此外,API提供壓縮選項,表創建和處理,圖形和圖像功能&am…

Kile鐘優化等級講解

這里直接說說kile的優化等級: 這里有4個等級,分別為:-O0、-O1、-O2、-O3 為什么要進行編譯優化? 主要目的: 1. 提高代碼執行的速度; 2. 減少內存占用; 3. 降低能耗,延長電池壽命; 4. 消除代碼中冗余和不必要的代碼,提高程序穩定性和可靠性。 Kile等級描述: -O0:這…

leetcode-21-回溯-全排列及其去重

一、[46]全排列 給定一個 沒有重復 數字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3]輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 其中,不需要使用startIndex used數組,其實就是記錄此時path里都有哪些元素…

【圖論】200. 島嶼問題

200. 島嶼問題 難度:中等 力扣地址:https://leetcode.cn/studyplan/top-100-liked/ 問題描述 給你一個由 1(陸地)和 0(水)組成的的二維網格,請你計算網格中島嶼的數量。 島嶼總是被水包圍&…

一個專為Android平臺設計的高度可定制的日歷庫

大家好,今天給大家分享一個高度可定制的日歷庫kizitonwose/Calendar。 Calendar專為Android平臺設計,支持RecyclerView和Compose框架。它提供了豐富的功能,允許開發者根據需求定制日歷的外觀和功能。 項目介紹 此庫是開發Android應用時&…

大型語言模型評估調查

原文鏈接:A Survey on Evaluation of Large Language Models | ACM Transactions on Intelligent Systems and Technology 本文從三個關鍵維度:評價什么、在哪里評價和如何評價,對這些 LLMs 評價方法進行了全面回顧。 首先,我們…

第十四屆藍橋杯省賽C++A組F題【買瓜】題解(AC)

70pts 題目要求我們在給定的瓜中選擇一些瓜,可以選擇將瓜劈成兩半,使得最后的總重量恰好等于 m m m。我們的目標是求出至少需要劈多少個瓜。 首先,我們注意到每個瓜的重量最多為 1 0 9 10^9 109,而求和的重量 m m m 也最多為…

C++ 徹底搞懂指針(1)

當有人問起,什么是指針時,我會毫不猶豫地回答,指針變量存放的是地址!然后呢,好像也說不出什么了,今天就再來詳細看一下指針吧。 本文提綱如下: ? 指針變量 ? 未初始化的指針 ? NULL ? void指針 ? 指針的指針 首先要明白幾點: ? 每個字節都有…

用OpenAI接口給女朋友手搓AI小助理,她說要獎勵我,結果……

前言 最近,我那財經系的小女友迎來了考試周,她的復習資料已經堆得像珠穆朗瑪峰一樣高。壓力山大的她不斷讓我幫她整理這些資料,還頻頻向我傾訴她的苦水。雖然我自己也挺忙的,但為了愛,我只能忍痛扛起這重擔。。。為了…

【C++】STL-priority_queue

目錄 1、priority_queue的使用 2、實現沒有仿函數的優先級隊列 3、實現有仿函數的優先級隊列 3.1 仿函數 3.2 真正的優先級隊列 3.3 優先級隊列放自定義類型 1、priority_queue的使用 priority_queue是優先級隊列,是一個容器適配器,不滿足先進先出…

Spring Boot配置文件properties/yml/yaml

一、Spring Boot配置文件簡介 (1)名字必須為application,否則無法識別。后綴有三種文件類型: properties/yml/yaml,但是yml和yaml使用方法相同 (2) Spring Boot 項?默認的配置文件為 properties &#xff…

【單片機畢業設計選題24041】-基于STM32的水質檢測系統

系統功能: 系統上電后顯示“歡迎使用水質檢測系統請稍后”兩秒后進入正常顯示頁面。 第一頁面第一行顯示“系統狀態信息”,第二行顯示溫度和PH值信息,第三行顯示 渾濁度信息,第四行顯示TDS值信息。 第一頁面下的按鍵操作: 短…

Kotlin中的類

類初始化順序 constructor 里的參數列表是首先被執行的,緊接著是 init 塊和屬性初始化器,最后是次構造函數的函數體。 主構造函數參數列表firstProperty 初始化第一個 init 塊secondProperty 初始化第二個 init 塊次構造函數函數體 class Example const…

英語動詞時態

英語動詞時態總結 動詞時態一般進行完成完成進行現在一般現在時態動詞原形/動詞原形s(第三人稱單數)eat/eats現在進行時態助動詞be的變位動詞的現在分詞am/is/are eating現在完成時態助動詞have的變位動詞的過去分詞has/have eaten現在完成進行時態have…

SSE代替輪詢?

什么是 SSE SSE(Server-Sent Events,服務器發送事件),為特定目的而擴展的 HTTP 協議,用于實現服務器向客戶端推送實時數據的單向通信。如果連接斷開,瀏覽器會自動重連,傳輸的數據基于文本格式。…

力扣(2024.07.01)

1. 84——柱狀圖中最大的矩形 給定 n 個非負整數,用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。 求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。 標簽:棧,數組,單調棧(目…

面試題--SpringBoot

SpringBoot SpringBoot 是什么(了解) 是 Spring 的子項目,主要簡化 Spring 開發難度,去掉了繁重配置,提供各種啟動器,可以 讓程序員很快上手,節省開發時間. SpringBoot 的優點(必會) SpringBoot 對上述 Spring 的缺點進行的改善和優化,基于約定優于配置的思想&am…

rust嵌入式開發2024

老的rust embedded book 其實過時了. 正確的姿勢是embassy 入手. 先說下以前rust寫嵌入怎么教學小白的. 第一步,從這里 svd2rust 工具,自己生成庫第二部,有了這個庫,相當于就有了pac外設訪問文件,然后其實就可以搞起來了. 那么為啥不好搞了. 因為太亂了. 小白喜歡你告我咋弄…

[python][Anaconda]使用jupyter打開F盤或其他盤文件

jupyter有一個非常不好的體驗,就是不能在界面切換到其他盤來打開文件。 使用它,比較死板的操作是要先進入文件目錄,再運行jupyter。 以Windows的Anaconda安裝了jupyter lab或jupyter notebook為例。 1,先運行Anaconda Prompt 2&…

[Day 22] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

大數據與AI的關聯性 引言 大數據和人工智能(AI)是當今科技界的兩大熱門話題。這兩者的聯繫愈加緊密,相互影響和促進,形成了一個強大的技術生態系統。大數據提供了豐富的數據來源,而AI則利用這些數據來訓練和優化算法…