第十一课:综合项目 - 多语言文件管理器
(原课程规划中的第十五课,按用户要求调整为第十一课)
模块 | 功能描述 |
---|---|
文件浏览 | 显示当前目录下的文件和文件夹,支持双击进入子目录 |
搜索功能 | 支持关键字搜索文件名,支持多线程加速 |
剪切板历史 | 记录最近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资源文件
打开Qt Designer,创建main_window.ui
文件:
QTreeView
用于显示文件目录QLineEdit
作为搜索输入框QPushButton
用于切换语言QListWidget
显示剪切板历史保存UI文件后,使用pyuic5
生成Python代码:
pyuic5 ui/main_window.ui -o ui/main_window.py
在代码中使用tr()
函数包裹所有需要翻译的文本:
from PyQt5.QtCore import QCoreApplication
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle(self.tr("多语言文件管理器")) # 可翻译标题
self.search_button.setText(self.tr("搜索")) # 可翻译按钮文本
.ts
文件:pylupdate5 -noobsolete main.py -ts i18n/en.ts i18n/zh.ts
.ts
文件,输入对应语言的翻译内容.qm
文件:lrelease i18n/en.ts i18n/zh.ts
from PyQt5.QtCore import QTranslator, QLocale
def load_language(language_code):
translator = QTranslator()
if translator.load(f"i18n/{language_code}.qm"):
QCoreApplication.installTranslator(translator)
# 重新加载UI以更新文本
self.retranslateUi()
QThread
实现后台搜索:from PyQt5.QtCore import QThread, pyqtSignal
import os
class SearchWorker(QThread):
result_ready = pyqtSignal(str)
def __init__(self, directory, keyword):
super().__init__()
self.directory = directory
self.keyword = keyword
def 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))
worker = SearchWorker(current_dir, search_keyword)
worker.result_ready.connect(self.update_search_results)
worker.start()
from PyQt5.QtGui import QClipboard
class 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)
if len(self.history) > 10:
self.history.pop(0)
resources.qrc
文件:<RCC>
<qresource prefix="/">
<file>icons/folder.pngfile>
<file>icons/file.pngfile>
<file>styles.qssfile>
qresource>
RCC>
pyrcc5 qrc/resources.qrc -o resources_rc.py
import resources_rc # 导入编译后的资源
QFile(":/styles.qss").open(QFile.ReadOnly)
stylesheet = QFile.readAll()
self.setStyleSheet(stylesheet)
import sys
from PyQt5.QtWidgets import QApplication
from ui.main_window import Ui_MainWindow
from i18n.translator import load_language
class 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_())
安装依赖:
pip install pyinstaller
打包命令:
pyinstaller -F -w --add-data "resources/*;resources" --icon=resources/icons/app_icon.ico main.py
处理资源路径问题:
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)
retranslateUi()
方法QThread
或QRunnable
分离搜索任务pyrcc5
是否成功生成resources_rc.py
--add-data
参数包含资源目录本项目综合运用了以下技术点:
.ts
文件和QTranslator
实现国际化.qrc
文件统一管理图标和样式表扩展方向:
本系列课程到此结束!通过本课程的学习,您将掌握如何构建一个完整的多语言桌面应用,并为后续开发复杂软件打下基础!