PyQt学习记录03——批量设置水印

0. 目录

PyQt学习记录01------加法计算器
PyQt学习记录02------串口助手

1. 前言

本次主要是为了学习Qt中的 QFileDialog 函数,

QFileDialog.getExistingDirectory:用于选择文件夹,返回的是一个文件夹路径。

QFileDialog.getOpenFileName: 用于选择单个文件。返回的是文件的完整路径。

以及通过importlib.util实现跨文件的函数调用,即通过将定义一个对象,动态加载和调用该py文件中的函数(详见第二小节)

希望对你有所帮助。

2. Ui界面

lineEdit 用于记录文件夹路径

lineEdit_2 用于记录水印文件路径

其余元素详见第3小节的程序代码

3. 程序代码

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from WaterMask import Ui_MainWindow  # 导入 WaterMask 的 UI 类
from PyQt5.QtCore import QTimer
import importlib.util # 用于动态加载2.py中的函数

# 动态加载 2.py
#加载一个名为 "watermark" 的模块(可自由命名),它的文件路径是 "2.py"。
spec = importlib.util.spec_from_file_location("watermark", "2.py")
#用于创建一个模块对象watermark_module。
watermark_module = importlib.util.module_from_spec(spec)
#这行代码的作用是执行 "2.py" 文件中的代码,并将模块中的函数、类等加载到 watermark_module 对象中。
spec.loader.exec_module(watermark_module)
#调用则使用watermark_module.add_watermark_to_images(folder_path, watermark_path)

class WatermarkApp(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)  # 设置 UI 界面

        # 绑定按钮点击事件
        self.pushButton.clicked.connect(self.select_folder) # 打开文件夹路径
        self.pushButton_2.clicked.connect(self.select_watermark) # 打开水印路径
        self.pushButton_3.clicked.connect(self.process_files) # 开始转换按钮

    def select_folder(self):
        folder_path = QFileDialog.getExistingDirectory(self, "选择文件夹")
        if folder_path:
            self.lineEdit.setText(folder_path)

    def select_watermark(self):
        watermark_path, _ = QFileDialog.getOpenFileName(self, "选择水印图片", "", "Image Files (*.png *.jpg *.bmp *.jpeg)")
        if watermark_path:
            self.lineEdit_2.setText(watermark_path)

    def process_files(self):
        folder_path = self.lineEdit.text()
        watermark_path = self.lineEdit_2.text()

        if not folder_path or not watermark_path:
            print("请先选择文件夹和水印图片")
            return
        # 按钮按下后直接变为 "转换中"
        self.pushButton_3.setText("转换中")
        self.pushButton_3.setEnabled(False)

        # 延时500ms调用 2.py 中的 add_watermark_to_images 函数,传递回调函数来恢复按钮状态
        QTimer.singleShot(500, lambda: self.start_batch_processing(folder_path, watermark_path))

    def start_batch_processing(self, folder_path, watermark_path):
        # 调用 2.py 中的批量处理函数
        watermark_module.add_watermark_to_images(folder_path, watermark_path)

        # 批量处理完成后恢复按钮状态
        self.pushButton_3.setText("开始转换")
        self.pushButton_3.setEnabled(True)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = WatermarkApp()
    window.show()
    sys.exit(app.exec_())

需要注意的是,本次学习调用了2.py来处理复杂的水印添加功能,所以展现的的代码中,可以理解为只是一个连接ui界面和2.py中的批处理函数的中间件,即ui界面提供文件路径和开始命令,通过所展现代码传递给2.py

注意以下仅展现的2.py的基础代码

python 复制代码
from PIL import Image
import os

def add_watermark_to_images(folder_path, watermark_path):
    try:
        for filename in os.listdir(folder_path):
            file_path = os.path.join(folder_path, filename)
            if file_path.lower().endswith(('png', 'jpg', 'jpeg', 'bmp')):
                print(f"给 {file_path} 添加水印: {watermark_path}")
        
    except Exception as e:
        print(f"发生错误: {e}")

需要注意的是,这里使用的动态加载方法在使用pyinstaller打包为exe文件时会出现找不到2.py文件的问题,所以你需要将动态加载更改为传统import导入,同时将2.py更改为two.py

python 复制代码
import two

'''
import importlib.util # 用于动态加载2.py中的函数
# 动态加载 two.py
#加载一个名为 "watermark" 的模块(可自由命名),它的文件路径是 "two.py"。
spec = importlib.util.spec_from_file_location("watermark", "two.py")
#用于创建一个模块对象watermark_module。
watermark_module = importlib.util.module_from_spec(spec)
#这行代码的作用是执行 "two.py" 文件中的代码,并将模块中的函数、类等加载到 watermark_module 对象中。
spec.loader.exec_module(watermark_module)
#调用则使用watermark_module.add_watermark_to_images(folder_path, watermark_path)
'''
#调用则使用
two.add_watermark_to_images(folder_path, watermark_path)

4. 运行结果

点击'开始转换'后,按钮文本改变为'转换中',同时在控制台中显示进度,转换完成后按钮恢复

相关推荐
西岸行者3 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码3 天前
嵌入式学习路线
学习
毛小茛3 天前
计算机系统概论——校验码
学习
babe小鑫3 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms3 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下3 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。3 天前
2026.2.25监控学习
学习
im_AMBER3 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J3 天前
从“Hello World“ 开始 C++
c语言·c++·学习