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

devtools/2025/2/13 15:59:57/

0. 目录

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

1. 前言

本次主要是为了学习Qt中的 QFileDialog 函数,
QFileDialog.getExistingDirectory:用于选择文件夹,返回的是一个文件夹路径。
QFileDialog.getOpenFileName: 用于选择单个文件。返回的是文件的完整路径。

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

希望对你有所帮助。

2. Ui界面

lineEdit 用于记录文件夹路径
lineEdit_2 用于记录水印文件路径
其余元素详见第3小节的程序代码
请添加图片描述

3. 程序代码

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的基础代码

from PIL import Image
import osdef 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

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. 运行结果

点击’开始转换’后,按钮文本改变为’转换中’,同时在控制台中显示进度,转换完成后按钮恢复
请添加图片描述


http://www.ppmy.cn/devtools/158524.html

相关文章

Go语言构建微服务:从入门到实战

引言 在云原生时代,微服务架构已成为构建复杂分布式系统的首选方案。Go语言凭借其卓越的并发支持、简洁的语法和高效的运行时,成为微服务开发的利器。本文将深入探讨如何用Go构建健壮的微服务系统,并通过完整案例演示关键实现细节。 一、微…

在 Ubuntu 上安装最新版本的 CMake

教程:在 Ubuntu 上安装最新版本的 CMake 在 Ubuntu 系统上安装最新版本的 CMake 可以通过官方的二进制文件进行安装,避免使用 PPA 或 Snap,确保获取最新版本。以下是详细的步骤: 步骤 1:下载 CMake 二进制文件 访问 C…

windows系统远程桌面连接ubuntu18.04

记录一下自己在配置过程中遇到的问题,记录遇到的两大坑: windows系统通过xrdp远程桌面连接ubuntu18.04的蓝屏问题。参考以下第一章解决。 同一局域网内网段不同的连接问题。参考以下第三章解决,前提是SSH可连。 1. 在ubuntu上安装xrdp 参考&…

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(四级)

青少年软件编程(Python)等级考试试卷(四级) 一、单选题(共25题,共60分) 1.以下有关位置实参和关键字实参的表述中,错误的选项是?(C) A.位置实参和关键字实参可以混用。 B. 形参不占用内存地址。 C.调用函…

网络安全架构分层 网络安全组织架构

1.1.4 网络安全系统的基本组成 上节介绍到了,网络安全系统是一个相对完整的安全保障体系。那么这些安全保障措施具体包括哪些,又如何体现呢?这可以从OSI/RM的7层网络结构来一一分析。因为计算机的网络通信,都离不开OSIR/RM的这7层…

【大数据安全分析】大数据安全分析技术框架与关键技术

在数字化时代,网络安全面临着前所未有的挑战。传统的网络安全防护模式呈现出烟囱式的特点,各个安全防护措施和数据相互孤立,形成了防护孤岛和数据孤岛,难以有效应对日益复杂多变的安全威胁。而大数据分析技术的出现,为解决这些问题带来了新的曙光。 大数据分析在网络安全…

SQLite 数据库:优点、语法与快速入门指南

文章目录 一、引言二、SQLite 的优点 💯三、SQLite 的基本语法3.1 创建数据库3.2 创建表3.3 插入数据3.4 查询数据3.5 更新数据3.6 删除数据3.7 删除表 四、快速入门指南4.1 安装 SQLite4.2 创建数据库4.3 创建表4.4 插入数据4.5 查询数据4.6 更新数据4.7 删除数据4…

适配器模式 + 外观模式联合使用:新旧系统的平滑整合之道

🌟 引言:当系统演进遇到历史包袱 场景痛点: 假设企业需要将老旧的CRM系统与新的SaaS平台整合,面临: 旧系统接口:XML格式+同步调用新系统接口:JSON格式+异步调用需要统一提供简洁的RESTful API给前端若直接修改旧系统: // 旧系统核心类(无法修改) public class Leg…