PyQt6實例_批量下載pdf工具_主線程啟用線程池

目錄

前置:

代碼:

視頻:


前置:

1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭,放在 【PyQt6實例】 專欄
2 本系列涉及到的PyQt6知識點:
線程池:QThreadPool,QRunnable;
信號與槽:pyqtSignal,pyqtSlot;
界面:QTextEdit,QLabel,QLineText,QPushButton,QMainWindow,QWidget;
布局:QHBoxLayout,QVBoxLayout;
彈框:QFileDialog,QMessageBox。
3 本系列后續會在B站錄制視頻,到時會在文末貼出鏈接。本人還是建議先看博文,不懂的再看視頻,這樣效率高,節約時間。

代碼:

    def execute_btn_clicked(self):txt_dir = self.txtdir_lineedit.text()if txt_dir is None or len(txt_dir.strip())<=0:self.information_dialog('請先選擇txt所在目錄')returntxt_list = os.listdir(txt_dir)if len(txt_list)<=0:self.information_dialog('txt所在目錄為空')returnpdf_dir = self.savedir_lineedit.text()if pdf_dir is None or len(pdf_dir.strip())<=0:self.information_dialog('請設置pdf存儲目錄')returnanswer = QMessageBox.question(self,'確認啟動?',f'如果確定啟動,程序將把任務分成 {self.max_thread_count} 個線程執行。執行過程將占用設備資源。',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)if answer == QMessageBox.StandardButton.Yes:self.this_time_start_yeah = Trueself.thread_finished_count = 0self.txtdir_lineedit.setDisabled(True)self.savedir_lineedit.setDisabled(True)self.choicedir_btn.setDisabled(True)self.savedir_btn.setDisabled(True)self.execute_btn.setDisabled(True)if self.last_time_executed_tickers is not None:for one in self.last_time_executed_tickers:txt_list.remove(f'{one}.txt')pass# 分發任務interval = len(txt_list)//self.max_thread_countif interval == 0:self.max_thread_count = 1self.insert_executelog('需要執行的內容很少,只開啟一個線程')passfor i in range(0,self.max_thread_count):if i == self.max_thread_count-1:node_txt_list = txt_list[i*interval:]else:node_txt_list = txt_list[i*interval:(i+1)*interval]task_data = {'txt_dir':txt_dir,'pdf_dir':pdf_dir,'txt_list':node_txt_list,'temp_dict':self.last_time_data}worker = Worker(i,task_data)worker.signals.result.connect(self.thread_result_fn)worker.signals.finished.connect(self.thread_finished_fn)worker.signals.error.connect(self.thread_error_fn)self.runner_list.append(worker)self.insert_otherlog(f'線程 {i} 啟動。')self.threadpool.start(worker)passelse:returnpassdef thread_result_fn(self,res:tuple):# (thread_num,stoped,ticker,executed_url_list,excuted_ticker_list)# (thread_num,success,None,None,excuted_ticker_list)thread_num = res[0]status = res[1]if status == 'stoped':self.insert_otherlog(f'線程 {thread_num} 停止.')if res[2] is not None:self.pre_last_time_data[res[2]] = res[3]self.pre_last_time_executed_tickers.extend(res[4])passelse:self.insert_otherlog(f'線程 {thread_num} 正常結束。')passdef thread_finished_fn(self,res:int):self.thread_finished_count += 1res_str = f'線程 {res} 結束.'self.insert_otherlog(res_str)if self.thread_finished_count == self.max_thread_count:temp_str = '上次執行正常結束'if self.pre_last_time_data:temp_str = '上次被強制停止'with open(os.path.join(basedir,'data','temp.json'),'w',encoding='utf-8') as fw:json.dump(self.pre_last_time_data,fw)passif len(self.pre_last_time_executed_tickers)>0:temp_str = '上次被強制停止'tickers_str = '\n'.join(self.pre_last_time_executed_tickers)with open(os.path.join(basedir,'data','executed.txt'),'w',encoding='utf-8') as fw:fw.write(tickers_str)passpre_str = f"{self.txtdir_lineedit.text()};{self.savedir_lineedit.text()};{temp_str}"with open(os.path.join(basedir,'data','params.txt'),'w',encoding='utf-8') as fw:fw.write(pre_str)if self.waitting_close:self.close()else:self.txtdir_lineedit.setDisabled(False)self.savedir_lineedit.setDisabled(False)self.choicedir_btn.setDisabled(False)self.savedir_btn.setDisabled(False)self.execute_btn.setDisabled(False)self.infomation_dialog('所有工作線程停止完畢')passpassdef thread_error_fn(self,res:tuple):error_str = f"線程 {res[0]} 報錯。報錯類型:{res[1]}。值:{res[2]}。異常棧:{res[3]}"self.insert_executelog(error_str)pass

視頻:

https://www.bilibili.com/video/BV1zeZcYQEax/
https://www.bilibili.com/video/BV1BeZcYQEZq/
https://www.bilibili.com/video/BV1VSZAYJEUf/
https://www.bilibili.com/video/BV1KKZPYBEJV/
https://www.bilibili.com/video/BV1KKZPYBEG2/

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

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

相關文章

1.2 斐波那契數列模型:LeetCode 面試題 08.01. 三步問題

動態規劃解三步問題&#xff1a;LeetCode 面試題 08.01. 三步問題 1. 題目鏈接 LeetCode 面試題 08.01. 三步問題 題目要求&#xff1a;小孩上樓梯&#xff0c;每次可以走1、2或3步&#xff0c;計算到達第 n 階臺階的不同方式數&#xff0c;結果需對 1e9 7 取模。 2. 題目描述…

UE5 學習筆記 FPS游戲制作30 顯示擊殺信息 水平框 UI模板(預制體)

文章目錄 一制作單條死亡信息框水平框的使用創建一個水平框添加子元素調整子元素順序子元素的布局插槽尺寸填充對齊 制作UI 根據隊伍&#xff0c;設置文本的名字和顏色聲明變量 將變量設置為構造參數根據隊伍&#xff0c;設置文本的名字和顏色在構造事件中&#xff0c;獲取玩家…

HTTP---基礎知識

天天開心&#xff01;&#xff01;&#xff01; 文章目錄 一、HTTP基本概念1. 什么是HTTP&#xff0c;又有什么用&#xff1f;2. 一次HTTP請求的過程3.HTTP的協議頭4.POST和GET的區別5. HTTP狀態碼6.HTTP的優缺點 二、HTTP的版本演進1.各個版本的應用場景2、注意要點 三、HTTP與…

數據結構 KMP 字符串匹配算法

KMP算法是計算機科學中的一種字符串匹配算法&#xff0c;KMP是三個創始人名字首字母 題目 AcWing - 算法基礎課 前置知識點 KMP算法是一種高效的字符串匹配算法&#xff0c;算法名稱取自于三位共同發明人名字的首字母組合。該算法的主要使用場景就是在字符串&#xff08;也叫…

Conda配置Python環境

1. 安裝 Conda 選擇發行版&#xff1a; Anaconda&#xff1a;適合需要預裝大量科學計算包的用戶&#xff08;體積較大&#xff09;。 Miniconda&#xff1a;輕量版&#xff0c;僅包含 Conda 和 Python&#xff08;推薦自行安裝所需包&#xff09;。 驗證安裝&#xff1a; co…

數倉開發那些事(11)

某神州優秀員工&#xff1a;一閃&#xff0c;領導說要給我漲米。 一閃&#xff1a;。。。。&#xff08;著急的團團轉&#xff09; 老運維&#xff1a;Oi&#xff0c;兩個吊毛&#xff0c;看看你們的hadoop集群&#xff0c;健康度30分&#xff0c;怎么還在抽思謀克&#xff1f…

MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案

? MyBatis Plus 中 update_time 字段自動填充失效的原因分析及解決方案 前言一、問題現象二、原因分析1. 使用了 strictInsertFill/strictUpdateFill 導致更新失效2. 實體類注解配置錯誤3. MetaObjectHandler 未生效4. 使用自定義 SQL 導致自動填充失效5. 字段類型不匹配 三、…

C++ STL常用算法之常用算術生成算法

常用算術生成算法 學習目標: 掌握常用的算術生成算法 注意: 算術生成算法屬于小型算法&#xff0c;使用時包含的頭文件為 #include <numeric> 算法簡介: accumulate // 計算容器元素累計總和 fill // 向容器中添加元素 accumulate 功能描述: 計算區間內容器元素…

axios基礎入門教程

一、axios 簡介 axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;可用于瀏覽器和 Node.js 環境&#xff0c;支持以下特性&#xff1a; 發送 HTTP 請求&#xff08;GET/POST/PUT/DELETE 等&#xff09; 攔截請求和響應 自動轉換 JSON 數據 取消請求 并發請求處理 二…

短視頻團隊架構工作流程---2025.3.30 李劭卓

短視頻團隊架構&工作流程—2025.3.30 李劭卓 文章目錄 短視頻團隊架構&工作流程---2025.3.30 李劭卓1 工作職責1.1 編劇&#xff1a;1.2 主編&#xff1a;1.3 總編&#xff1a;1.4 導演&#xff1a;1.5 攝影&#xff1a;1.6 演員&#xff1a;1.7 后期&#xff1a;1.8 美…

MySQL 高效 SQL 使用技巧詳解

MySQL 高效 SQL 使用 技巧詳解 一、為什么需要優化 SQL&#xff1f; 性能瓶頸&#xff1a;慢查詢導致數據庫負載升高&#xff0c;響應時間延長。資源浪費&#xff1a;低效 SQL 可能占用大量 CPU、內存和磁盤 I/O。 目標&#xff1a;通過優化 SQL 將查詢性能提升 10 倍以上&am…

AI基礎03-視頻數據采集

上篇文章我們學習了圖片的數據采集&#xff0c;今天主要了解一下視頻數據采集的方法。視頻是由一系列圖像構成的&#xff0c;其中每一張圖片就是一幀。視頻數據采集方法通常有自動圖像采集和基于處理器的圖像采集兩種。我們學習一下如何利用python 工具和筆記本計算機攝像頭進行…

Scala 數組

Scala 數組 引言 Scala 作為一門多范式編程語言&#xff0c;融合了面向對象和函數式編程的特點。數組是編程語言中非常基礎和常見的數據結構&#xff0c;在 Scala 中也不例外。本文將詳細介紹 Scala 中的數組&#xff0c;包括其定義、操作以及在實際開發中的應用。 Scala 數…

Text-to-SQL將自然語言轉換為數據庫查詢語句

有關Text-To-SQL方法&#xff0c;可以查閱我的另一篇文章&#xff0c;Text-to-SQL方法研究 直接與數據庫對話-text2sql Text2sql就是把文本轉換為sql語言&#xff0c;這段時間公司有這方面的需求&#xff0c;調研了一下市面上text2sql的方法&#xff0c;比如阿里的Chat2DB,麻…

golang 的strconv包常用方法

目錄 1. 字符串與整數的轉換 2. 字符串與浮點數的轉換 3. 布爾值的轉換 4. 字符串的轉義 5. 補充&#xff1a;rune 類型的使用 方法功能詳解 代碼示例&#xff1a; 1. 字符串與整數的轉換 方法名稱功能描述示例Atoi將字符串轉換為十進制整數。strconv.Atoi("123&q…

MATLAB詳細圖文安裝教程(附安裝包)

前言 MATLAB&#xff08;Matrix Laboratory&#xff09;是由MathWorks公司開發的一款高性能的編程語言和交互式環境&#xff0c;主要用于數值計算、數據分析和算法開發。內置數學函數和工具箱豐富&#xff0c;開發效率高&#xff0c;特別適合矩陣運算和領域特定問題。接下來就…

ShapeCrawler:.NET開發者的PPTX操控魔法

引言 在當今的軟件開發領域&#xff0c;隨著數據可視化和信息展示需求的不斷增長&#xff0c;處理 PPTX 文件的場景日益頻繁。無論是自動化生成報告、批量制作演示文稿&#xff0c;還是對現有 PPT 進行內容更新與格式調整&#xff0c;開發者都需要高效的工具來完成這些任務。傳…

HTML5貪吃蛇游戲開發經驗分享

HTML5貪吃蛇游戲開發經驗分享 這里寫目錄標題 HTML5貪吃蛇游戲開發經驗分享項目介紹技術棧核心功能實現1. 游戲初始化2. 蛇的移動控制3. 碰撞檢測4. 食物生成 開發心得項目收獲后續優化方向結語 項目介紹 在這個項目中&#xff0c;我使用HTML5 Canvas和原生JavaScript實現了一…

有關pip與conda的介紹

Conda vs. Pip vs. Virtualenv 命令對比 任務Conda 命令Pip 命令Virtualenv 命令安裝包conda install $PACKAGE_NAMEpip install $PACKAGE_NAMEX更新包conda update --name $ENVIRONMENT_NAME $PACKAGE_NAMEpip install --upgrade $PACKAGE_NAMEX更新包管理器conda update con…

【Linux】調試器——gdb使用

目錄 一、預備知識 二、常用指令 三、調試技巧 &#xff08;一&#xff09;監視變量的變化指令 watch &#xff08;二&#xff09;更改指定變量的值 set var 正文 一、預備知識 程序的發布形式有兩種&#xff0c;debug和release模式&#xff0c;Linux gcc/g出來的二進制…