PyQt學習系列11-綜合項目:多語言文件管理器

PyQt學習系列筆記(Python Qt框架)

第十一課:綜合項目 - 多語言文件管理器
(原課程規劃中的第十五課,按用戶要求調整為第十一課)


課程目標

  1. 綜合運用PyQt框架開發一個支持多語言的文件管理器
  2. 實現以下核心功能:
    • 文件瀏覽與目錄導航
    • 多線程文件搜索
    • 剪切板歷史記錄
    • 多語言切換(中/英)
    • 資源文件管理(圖標、樣式表)
  3. 掌握**國際化(i18n)與本地化(l10n)**的完整實現流程

一、項目需求分析

1.1 功能需求

模塊功能描述
文件瀏覽顯示當前目錄下的文件和文件夾,支持雙擊進入子目錄
搜索功能支持關鍵字搜索文件名,支持多線程加速
剪切板歷史記錄最近10條剪切/復制內容,支持回溯
多語言切換支持中/英文切換,界面文本自動更新
資源管理使用.qrc文件管理圖標和樣式表

二、項目結構設計

multi_language_file_manager/
├── main.py                  # 主程序入口
├── ui/
│   └── main_window.ui       # Qt Designer設計的UI文件
├── resources/
│   ├── icons/               # 圖標資源
│   └── styles.qss           # 樣式表文件
├── i18n/
│   ├── en.ts                # 英文翻譯文件
│   └── zh.ts                # 中文翻譯文件
└── qrc/└── resources.qrc        # Qt資源文件

三、核心功能實現

3.1 使用Qt Designer設計界面

  1. 打開Qt Designer,創建main_window.ui文件:

    • 添加QTreeView用于顯示文件目錄
    • 添加QLineEdit作為搜索輸入框
    • 添加QPushButton用于切換語言
    • 添加QListWidget顯示剪切板歷史
  2. 保存UI文件后,使用pyuic5生成Python代碼:

    pyuic5 ui/main_window.ui -o ui/main_window.py
    

3.2 多語言支持實現

3.2.1 標記可翻譯文本

在代碼中使用tr()函數包裹所有需要翻譯的文本:

from PyQt5.QtCore import QCoreApplicationclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle(self.tr("多語言文件管理器"))  # 可翻譯標題self.search_button.setText(self.tr("搜索"))         # 可翻譯按鈕文本

3.2.2 生成翻譯文件
  1. 創建.ts文件:
    pylupdate5 -noobsolete main.py -ts i18n/en.ts i18n/zh.ts
    
  2. 使用Qt Linguist編輯翻譯:
    • 雙擊打開.ts文件,輸入對應語言的翻譯內容
    • 保存后生成.qm文件:
      lrelease i18n/en.ts i18n/zh.ts
      

3.2.3 動態加載語言包
from PyQt5.QtCore import QTranslator, QLocaledef load_language(language_code):translator = QTranslator()if translator.load(f"i18n/{language_code}.qm"):QCoreApplication.installTranslator(translator)# 重新加載UI以更新文本self.retranslateUi()

3.3 多線程文件搜索

  1. 使用QThread實現后臺搜索:
from PyQt5.QtCore import QThread, pyqtSignal
import osclass SearchWorker(QThread):result_ready = pyqtSignal(str)def __init__(self, directory, keyword):super().__init__()self.directory = directoryself.keyword = keyworddef run(self):for root, dirs, files in os.walk(self.directory):for file in files:if self.keyword.lower() in file.lower():self.result_ready.emit(os.path.join(root, file))
  1. 主線程連接信號:
worker = SearchWorker(current_dir, search_keyword)
worker.result_ready.connect(self.update_search_results)
worker.start()

3.4 剪切板歷史記錄

  1. 監聽剪切板變化:
from PyQt5.QtGui import QClipboardclass ClipboardMonitor(QObject):clipboard_changed = pyqtSignal(str)def __init__(self):super().__init__()self.clipboard = QApplication.clipboard()self.clipboard.dataChanged.connect(self.on_clipboard_change)self.history = []def on_clipboard_change(self):text = self.clipboard.text()if text not in self.history:self.history.append(text)self.clipboard_changed.emit(text)
  1. 限制歷史記錄數量:
if len(self.history) > 10:self.history.pop(0)

3.5 資源文件管理

  1. 創建resources.qrc文件:
<RCC><qresource prefix="/"><file>icons/folder.png</file><file>icons/file.png</file><file>styles.qss</file></qresource>
</RCC>
  1. 編譯資源文件:
pyrcc5 qrc/resources.qrc -o resources_rc.py
  1. 加載資源文件:
import resources_rc  # 導入編譯后的資源
QFile(":/styles.qss").open(QFile.ReadOnly)
stylesheet = QFile.readAll()
self.setStyleSheet(stylesheet)

四、完整代碼示例

4.1 主程序入口(main.py)

import sys
from PyQt5.QtWidgets import QApplication
from ui.main_window import Ui_MainWindow
from i18n.translator import load_languageclass MainWindow(Ui_MainWindow, QMainWindow):def __init__(self):super().__init__()self.setupUi(self)self.init_ui()self.init_translator()def init_ui(self):# 初始化UI邏輯self.search_button.clicked.connect(self.start_search)def init_translator(self):self.translator = QTranslator()self.current_language = "en"self.load_language(self.current_language)def load_language(self, code):if self.translator.load(f"i18n/{code}.qm"):QCoreApplication.installTranslator(self.translator)self.retranslateUi()  # 更新UI文本def start_search(self):keyword = self.search_input.text()worker = SearchWorker(self.current_dir, keyword)worker.result_ready.connect(self.update_search_results)worker.start()if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

五、項目打包與部署

5.1 使用PyInstaller打包

  1. 安裝依賴:

    pip install pyinstaller
    
  2. 打包命令:

    pyinstaller -F -w --add-data "resources/*;resources" --icon=resources/icons/app_icon.ico main.py
    
  3. 處理資源路徑問題:

    def resource_path(relative_path):if hasattr(sys, '_MEIPASS'):return os.path.join(sys._MEIPASS, relative_path)return os.path.join(os.path.abspath("."), relative_path)
    

六、常見問題與解決方案

6.1 多語言切換后UI未更新

  • 原因:未調用retranslateUi()方法
  • 解決方法:在切換語言后手動更新UI文本

6.2 搜索功能卡頓

  • 原因:未使用多線程
  • 解決方法:使用QThreadQRunnable分離搜索任務

6.3 資源文件無法加載

  • 原因:路徑錯誤或未正確編譯.qrc文件
  • 解決方法
    1. 檢查pyrcc5是否成功生成resources_rc.py
    2. 在打包時使用--add-data參數包含資源目錄

七、總結與擴展

本項目綜合運用了以下技術點:

  1. PyQt框架:實現文件管理器核心功能
  2. 多語言支持:通過.ts文件和QTranslator實現國際化
  3. 多線程:提升搜索性能
  4. 資源管理:使用.qrc文件統一管理圖標和樣式表

擴展方向

  • 添加文件預覽功能(如圖片/文本預覽)
  • 支持拖放操作
  • 實現文件同步/備份功能

八、附錄:完整項目代碼倉庫


本系列課程到此結束!通過本課程的學習,您將掌握如何構建一個完整的多語言桌面應用,并為后續開發復雜軟件打下基礎!

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

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

相關文章

【Ubuntu修改串口延時(Latency Timer)為1毫秒(設備拔插或系統重啟后自動生效)】

Ubuntu修改串口延時Latency Timer為1毫秒-設備拔插或系統重啟后自動生效 在Ubuntu系統中&#xff0c;串口設備的延時參數(latency_timer)可以通過udev規則永久修改。以下是完整步驟&#xff1a; 創建udev規則文件 sudo vim /etc/udev/rules.d/99-ftdi-low-latency.rules添加以…

OpenCV CUDA模塊圖像處理------顏色空間處理之GPU 上交換圖像的通道順序函數swapChannels()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于在 GPU 上交換圖像的通道順序&#xff08;例如將 BGR 圖像轉為 RGB&#xff09;。 它適用于多通道圖像&#xff08;如 3 通道或 4 通道…

Linux Ubuntu24.04配置安裝MySQL8.4.5高可用集群主從復制!

MySQL 主從復制&#xff08;Replication&#xff09;是實現數據高可用、讀寫分離及異地容災的核心機制之一。主庫寫、從庫讀&#xff0c;提升并發能力&#xff1b;讀寫分離&#xff0c;減輕主庫壓力。 本地 windows 系統有一個Linux Ubuntu子系統&#xff0c;版本為Ubuntu 24.…

R基于邏輯回歸模型實現心臟病檢測及SHAP值解釋項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔視頻講解&#xff09;&#xff0c;如需數據代碼文檔視頻講解可以直接到文章最后關注獲取。 1.項目背景 心血管疾病是全球范圍內導致死亡的主要原因之一&#xff0c;每年有數百萬人因此失去生命。在眾多的…

嵌入式學習筆記 -函數嵌套時以及異常響應時,LR使用的具體過程

函數嵌套時以及異常響應時&#xff0c;寄存器LR的作用存在顯著區別&#xff0c;理解這個問題對于理解freeRTOS底層代碼的實現大有幫助&#xff0c;具體使用過程如下&#xff1a; 一 函數嵌套時的LR使用的具體過程 在ARM架構(特別是M0處理器)中&#xff0c;函數嵌套調用時LR(L…

Java String函數的使用

文章目錄 String字符串比較字符串查找轉化字符串替換字符串拆分字符串截取&#xff08;常用&#xff09;字符串的不可變性 String str本來是字符串常量的引用&#xff0c;應該打印地址&#xff0c;但是編譯器重寫了toString方法&#xff0c;所以打印hello String 的構造方法 …

Oracle 11G RAC重啟系統異常

vmware安裝centos7環境部署Oracle RAC (11.2.0.4) 部署時所有資源情況都是正常的&#xff0c;關機重啟虛擬機后集群資源狀態異常&#xff0c;請教CSDN大佬 – 部署規劃 域名地址備注rac16192.168.31.16rac17192.168.31.17rac16vip192.168.31.26viprac17vip192.168.31.27vip…

吉林省CCPC與全國邀請賽(東北地區賽)游記

總述&#xff1a; 本次賽段共獲得一銀&#xff08;吉林省賽&#xff09;、一銅&#xff08;東北地區賽&#xff09;、一鐵&#xff08;全國邀請賽的成績&#xff09;。總體成績跟校內賽的情況相比隊伍狀態與發揮水準都有提升&#xff09;&#xff0c;但也體現出很多不足&#x…

「Python教案」循環語句的使用

課程目標 1&#xff0e;知識目標 能使用for循環和while循環設計程序。能使用循環控制語句&#xff0c;break、continue、else設計程序。能使用循環實際問題。 2&#xff0e;能力目標 能根據需求合適的選擇循環結構。能對嵌套循環代碼進行調試和優化。能利用循環語句設計&am…

OpenCV---findCountours

一、基本概念與用途 findContours是OpenCV中用于在二值圖像中查找輪廓的核心函數。輪廓作為連續的點集&#xff0c;能夠精確勾勒出物體的邊界&#xff0c;廣泛應用于目標檢測、形狀分析、圖像分割等領域。 函數核心價值 目標檢測&#xff1a;通過輪廓定位圖像中的物體&#…

20250523-BUG:無法加載“GameLib/Framework.h“頭文件(已解決)

BUG&#xff1a;無法加載"GameLib/Framework.h"頭文件&#xff08;已解決&#xff09; 最近在打開新的C項目時報了這個錯&#xff0c;我是按照以下步驟來排除的BUG&#xff0c;希望對您有所幫助~ 檢查【C/C】-【附加包含目錄】中的路徑有無問題&#xff0c;一般需要加…

商品條形碼查詢接口如何用C#進行調用?

一、什么是商品條碼查詢接口&#xff1f; 1974年6月26日&#xff0c;美國俄亥俄州的一家超市首次使用商品條碼完成結算&#xff0c;標志著商品條碼正式進入商業應用領域。這項技術通過自動識別和數據采集&#xff0c;極大提升了零售行業的作業效率&#xff0c;減少了人工錄入錯…

SD07_NVM的安裝及相關操作

以下是在 Windows 系統 上使用 NVM&#xff08;Node Version Manager&#xff09; 管理多個 Node.js 版本的詳細步驟&#xff0c;從零開始操作&#xff1a; 一、準備工作 卸載舊版 Node.js 打開 控制面板 → 程序和功能&#xff0c;找到已安裝的 Node.js 和 npm&#xff0c;徹底…

OSI 深度安全防御體系架構深度剖析

文章目錄 前言什么是 OSI 深度安全防御體系架構各層的安全防御措施物理層數據鏈路層網絡層傳輸層會話層表示層應用層 OSI 深度安全防御體系架構的優勢全方位防護深度防御靈活性和可擴展性 總結 前言 大家好&#xff0c;我是沛哥兒。今天咱們來深入探討一下 OSI 深度安全防御體…

大模型應用:開發移動端頁面個人中心頁面提示詞

角色 你是一個移動端web頁面開發專家&#xff0c;擅長開發移動端頁面&#xff0c;使用原生web技術&#xff08;html&#xff0c;css,js&#xff09;&#xff0c;開發的頁面針對手機移動端友好 技術棧 使用基礎的Html&#xff0c;CSS&#xff0c;JavaScript方案實現&#xff…

從零到一:影刀RPA學習者的破局之路

1. 學習目標與預期差距分析 1.1 官方課程學習目標梳理 影刀RPA的官方課程旨在幫助學習者掌握RPA&#xff08;機器人流程自動化&#xff09;的基本概念、操作技能和常見應用場景。課程內容通常包括&#xff1a; RPA基礎理論&#xff1a;介紹RPA的定義、優勢、發展歷程以及與其…

計算機組成與體系結構:硬盤驅動器(Hard Disk Drives)

目錄 &#x1f4bd; 硬盤驅動器&#xff08;HDD&#xff09;&#xff1a;傳統的固定輔助存儲設備 什么是硬盤驅動器&#xff1f; 硬盤的工作原理 HDD 的物理結構 Disk Pack&#xff08;盤組&#xff09; Tracks&#xff08;磁道&#xff09; Cylinders&#xff08;柱面&…

GitCode鏡像倉庫批量下載開發實錄

GitCode作為國內領先的開源代碼托管平臺&#xff0c;其鏡像倉庫批量下載功能對開發者生態建設與開源協作效率提升具有關鍵價值。本文基于企業級代碼資產管理需求&#xff0c;系統記錄從需求分析到生產部署的全周期開發實踐。內容覆蓋鏡像倉庫同步機制設計、分布式任務調度優化、…

基線配置管理:為什么它對網絡穩定性至關重要

什么是基線配置&#xff08;Baseline Configuration&#xff09; 基線配置&#xff08;Baseline Configuration&#xff09;是經過批準的標準化主設置&#xff0c;代表所有設備應遵循的安全、合規且運行穩定的配置基準&#xff0c;可作為評估變更、偏差或未授權修改的參考基準…

AJAX get請求如何提交數據呢?

在 AJAX 中使用 GET 請求提交數據&#xff0c;主要通過 在 URL 后拼接查詢參數 的方式實現&#xff0c;具體步驟如下&#xff1a; 1.構造帶參數的 URL 將數據以 鍵值 的形式拼接在 URL 后&#xff0c;多個參數間用 & 連接。例如&#xff1a; var url "https://exa…