构建批量文件重命名工具
使用 Python 和 PyQt 构建批量文件重命名工具-项目学习(原文链接)
目录
- 演示demo
- 项目布局
- 主要步骤
- 步骤1:构建GUI
- 步骤2:创建PyQt骨架应用程序
- 步骤3:使用pathlib PyQt 线程重命名文件
- 步骤4:根据重命名进度更新GUI状态
- 总结
demo演示
项目布局
rprename_project/是项目的根目录,在其中创建以下文件:
1. README.md
2. requirements.txt 提供项目的外部依赖项列表
3. rprenamer.py 提供一个入口脚本运行应用程序
rprename/目录将包含一个包含以下模块的Python包:
1. __init__.py 将rprename/作为Python包启动
2. app.py 提供PyQt骨架应用程序
3. rename.py 提供程序重命名功能
4. view.py 提供应用程序的GUI和Qt相关槽函数实现
ui/子目录包含所有GUI文件:
1. __init__.py 表明这是一个包
2. window.ui 程序ui框架 在QT Designer 中设计后生成
3. window.py 可以由window.ui经pyuic5工具直接生成
主要步骤
使用QTDesigner构建GUI界面
详情见原文视频创建pyQT骨架应用
- rprename/init.py 添加
1
2
3
4
5
6# -*- coding: utf-8 -*-
# rprename/__init__.py
"""This module provides the rprename package."""
__version__ = "0.1.0" #描述应用版本信息- rprename/views.py添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# -*- coding: utf-8 -*-
# rprename/views.py
"""This module provides the RP Renamer main window."""
from PyQt5.QtWidgets import QWidget #最开始的 qtDesigner 用的时widget类
from .ui.window import Ui_Form #将ui文件作为包导入
class Window(QWidget, Ui_Form):#创建了一个Window 类 继承自 QWidget和Ui_Form
#类的构建函数
def __init__(self):
#super()调用父类的构造
super().__init__()
self._setupUI()
def _setupUI(self):
self.setupUi(self)
- rprename/app.py添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# -*- coding: utf-8 -*-
# rprename/app.py
"""This module provides the RP Renamer application."""
import sys
from PyQt5.QtWidgets import QApplication
from .views import Window
# 将main()定义为应用程序的主函数
def main():
# Create the application
# 创建QApplication类的实例app
app = QApplication(sys.argv)
# Create and show the main window
# Window 是导入的views中的对象 创建Window类的实例Win
win = Window()
win.show()
# Run the event loop
# 使用了sys模块中exit()方法
sys.exit(app.exec())- rprenamer.py 添加(name==”main“详解)
1
2
3
4
5
6
7
8
9
10#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# rprenamer.py
"""This module provides the RP Renamer entry-point script."""
from rprename.app import main
if __name__ == "__main__":
main()使用Pathlib和PyQt thread 批量重命名文件
- rprename/views.py更新
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72# -*- coding: utf-8 -*-
# rprename/views.py
"""This module provides the RP Renamer main window."""
from PyQt5.QtWidgets import QWidget # 最开始的 qtDesigner 用的时widget类
from PyQt5.QtWidgets import QFileDialog #Loadfile按钮用到的QT类
from collections import deque # collection 提供了格外的python数据结构 导入双端队列进行操作更简单
from .ui.window import Ui_Form #将ui文件作为包导入
from pathlib import Path # python的文件处理包 主要用到Path.rename()来重命名文件
# 过滤器常量
FILTERS = ";;".join(
(
"PNG Files (*.png)",
"JPEG Files (*.jpeg)",
"JPG Files (*.jpg)",
"GIF Files (*.gif)",
"Text Files (*.txt)",
"Python Files (*.py)",
)
)
class Window(QWidget, Ui_Form):#创建了一个Window 类 继承自 QWidget和Ui_Form
#类的构建函数
def __init__(self):
#super()调用父类的构造
super().__init__()
# 创建一个deque对象 _files
self._files = deque()
# 创建_filesCount存储文件数量
self._filesCount = len(self._files)
self._setupUI()
def _setupUI(self):
self.setupUi(self)
#QT 槽函数 调用下一个LoadFiles()函数
def _connectSignalsSlots(self):
self.loadFilesButton.clicked.connect(self.loadFiles)
def loadFiles(self):
# 点击LoadFiles按钮 右侧列表清空
self.dstFileList.clear()
# 检测当前行编辑框 是否为空
if self.dirEdit.text():# 不为空,则initDir初始化为当前目录
initDir = self.dirEdit.text()
else:# 初始目录被设置为path .home(),它返回当前用户主文件夹的路径
initDir = str(Path.home())
# QFileDialog. getopenfilename ()这个静态方法接受几个参数,创建一个允许用户选择一个或多个文件的对话框,并返回一个基于字符串的所选文件路径列表。它还返回当前使用的文件过滤器。
# (parent,caption,dir,filter)其中parent设置父亲 caption设置显示字符串 dir设置路径 filter设置文件过滤
files, filter = QFileDialog.getOpenFileNames(
self, "Choose Files to Rename", initDir, filter=FILTERS
)
# 有文件被选择
if len(files) > 0:
# 切片当前过滤器字符串以提取文件扩展名。
fileExtension = filter[filter.index("*") : -1]
# 将. extensionlabel对象的文本设置为上一行提取的文件扩展名。
self.extensionLabel.setText(fileExtension)
# 将列表中第一个元素的上级目录 作为源目录
srcDirName = str(Path(files[0]).parent)
# 将. diredit行编辑的文本设置为上一行获得的目录路径。
self.dirEdit.setText(srcDirName)
# 为每个文件创建一个Path对象,并将其附加到._files 同时在左侧界面显示
for file in files:
self._files.append(Path(file))
self.srcFileList.addItem(file)
self._filesCount = len(self._files)
# python 不区分私有或共有属性完成了 Loadfile按钮的参函数定义和实现 同时 对载入文件进行加载