构建批量文件重命名工具

使用 Python 和 PyQt 构建批量文件重命名工具-项目学习(原文链接

目录

  • 演示demo
  • 项目布局
  • 主要步骤
    • 步骤1:构建GUI
    • 步骤2:创建PyQt骨架应用程序
    • 步骤3:使用pathlib PyQt 线程重命名文件
    • 步骤4:根据重命名进度更新GUI状态
  • 总结

demo演示

demo

项目布局

files

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工具直接生成

主要步骤

  1. 使用QTDesigner构建GUI界面
    files
    详情见原文视频

  2. 创建pyQT骨架应用

    1. 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" #描述应用版本信息
    1. 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)

    1. 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())
    1. 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()
  3. 使用Pathlib和PyQt thread 批量重命名文件

    1. 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按钮的参函数定义和实现 同时 对载入文件进行加载