小白一段时间学习PYTHON后,结合AI的第一个工具:看图工具
PYTHON+PYQT6
欢迎大家交流!
当前主要功能
- 浏览指定文件夹
- 过滤图片格式
- 根据exif信息自动旋转方向
- 可以播放指定音乐
- 可以删除同名所有图片
后续:
- 增加快捷键
- 增加图片放大缩小功能
- 增加幻灯片功能
- 解决图标打包功能
总结:
有了AI,事半功倍。
以上是源代码:
import os
from PyQt6.QtWidgets import QMainWindow,QApplication,QFileDialog,QMessageBox
from PyQt6.QtGui import QPixmap
from PyQt6.QtCore import pyqtSlot,Qt
from Ui_main import Ui_MainWindow
import func
import pygame
class MainWindow(QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# 初始化变量
self.image_folder = ""
self.image_files = []
self.current_image_index = 0
self.music_files = []
self.music_playing = False
self.supported_image_extensions = [".jpg", ".jpeg", ".png", ".bmp", ".gif"]
self.supported_music_extensions = [".mp3", ".wav", ".ogg"]
# 初始化音乐播放器
pygame.mixer.init()
@pyqtSlot()
def on_folder_button_clicked(self):
"""选择图片文件夹并过滤文件"""
folder =
QFileDialog.getExistingDirectory(self, "选择图片文件夹")
if folder:
self.image_folder = folder
self.image_files = [
f for f in os.listdir(folder) if os.path.splitext(f)[1].lower() in self.supported_image_extensions
]
self.current_image_index = 0
self.show_current_image()
def show_current_image(self):
"""显示当前图片,并根据 EXIF 数据自动旋转"""
if not self.image_files:
self.image_label.setText("没有图片可显示")
return
image_path = os.path.join(self.image_folder, self.image_files[self.current_image_index])
# 加载图片并自动旋转
cfunc=func.commonfunc()
pil_image = cfunc.load_image_with_orientation(image_path)
if pil_image:
pixmap = cfunc.convert_pil_to_qpixmap(pil_image)
# 缩放图片以适应窗口
scaled_pixmap = pixmap.scaled(
self.image_label.width(), self.image_label.height(), Qt.AspectRatioMode.KeepAspectRatio
)
self.image_label.setPixmap(scaled_pixmap)
else:
self.image_label.setText("无法加载图片")
@pyqtSlot()
def on_prev_button_clicked(self):
"""显示上一张图片"""
if self.image_files:
self.current_image_index = (self.current_image_index - 1) % len(self.image_files)
self.show_current_image()
@pyqtSlot()
def on_next_button_clicked(self):
"""显示下一张图片"""
if self.image_files:
self.current_image_index = (self.current_image_index + 1) % len(self.image_files)
self.show_current_image()
@pyqtSlot()
def on_music_button_clicked(self):
"""选择背景音乐文件"""
files, _ = QFileDialog.getOpenFileNames(
self, "选择背景音乐", "", "音乐文件 (*.mp3 *.wav *.ogg)"
)
if files:
self.music_files = files
self.play_music()
def play_music(self):
"""播放背景音乐"""
if self.music_files and not self.music_playing:
pygame.mixer.music.load(self.music_files[0]) # 只播放第一首
pygame.mixer.music.play(-1) # 循环播放
self.music_playing = True
def delete_current_image(self):
"""删除当前图片及其同名文件"""
if not self.image_files:
QMessageBox.warning(self, "警告", "没有图片可删除!")
return
current_image = self.image_files[self.current_image_index]
base_name, _ = os.path.splitext(current_image)
deleted_files = []
for file in os.listdir(self.image_folder):
if os.path.splitext(file)[0] == base_name:
file_path = os.path.join(self.image_folder, file)
try:
os.remove(file_path)
deleted_files.append(file)
except Exception as e:
QMessageBox.critical(self, "错误", f"无法删除文件 {file}: {e}")
if deleted_files:
QMessageBox.information(self, "成功", f"已删除文件:\n{', '.join(deleted_files)}")
del self.image_files[self.current_image_index]
if self.image_files:
self.current_image_index %= len(self.image_files)
self.show_current_image()
else:
self.image_label.setText("没有图片可显示")
def closeEvent(self, event):
"""关闭窗口时停止音乐"""
if self.music_playing:
pygame.mixer.music.stop()
event.accept()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())