2017網站備案抽查站長工具seo診斷
0. 目錄
PyQt學習記錄01——加法計算器
PyQt學習記錄02——串口助手
1. 前言
本次主要是為了學習Qt中的 QFileDialog 函數,
QFileDialog.getExistingDirectory:用于選擇文件夾,返回的是一個文件夾路徑。
QFileDialog.getOpenFileName: 用于選擇單個文件。返回的是文件的完整路徑。
以及通過importlib.util實現跨文件的函數調用,即通過將定義一個對象,動態(tài)加載和調用該py文件中的函數(詳見第二小節(jié))
希望對你有所幫助。
2. Ui界面
lineEdit 用于記錄文件夾路徑
lineEdit_2 用于記錄水印文件路徑
其余元素詳見第3小節(jié)的程序代碼
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 # 用于動態(tài)加載2.py中的函數# 動態(tài)加載 2.py
#加載一個名為 "watermark" 的模塊(可自由命名),它的文件路徑是 "2.py"。
spec = importlib.util.spec_from_file_location("watermark", "2.py")
#用于創(chuàng)建一個模塊對象watermark_module。
watermark_module = importlib.util.module_from_spec(spec)
#這行代碼的作用是執(zhí)行 "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# 按鈕按下后直接變?yōu)?“轉換中”self.pushButton_3.setText("轉換中")self.pushButton_3.setEnabled(False)# 延時500ms調用 2.py 中的 add_watermark_to_images 函數,傳遞回調函數來恢復按鈕狀態(tài)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)# 批量處理完成后恢復按鈕狀態(tài)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"發(fā)生錯誤: {e}")
需要注意的是,這里使用的動態(tài)加載方法在使用pyinstaller打包為exe文件時會出現找不到2.py文件的問題,所以你需要將動態(tài)加載更改為傳統(tǒng)import導入,同時將2.py更改為two.py
import two'''
import importlib.util # 用于動態(tài)加載2.py中的函數
# 動態(tài)加載 two.py
#加載一個名為 "watermark" 的模塊(可自由命名),它的文件路徑是 "two.py"。
spec = importlib.util.spec_from_file_location("watermark", "two.py")
#用于創(chuàng)建一個模塊對象watermark_module。
watermark_module = importlib.util.module_from_spec(spec)
#這行代碼的作用是執(zhí)行 "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. 運行結果
點擊’開始轉換’后,按鈕文本改變?yōu)椤D換中’,同時在控制臺中顯示進度,轉換完成后按鈕恢復