当然,这里是一个简洁而全面的介绍,适合用于在博客中介绍这个图像查看器程序:
Python 图像查看器
在这篇博客中,我将向大家介绍一个由我开发的简单但功能强大的图像查看器。这个图像查看器是用Python编写的,利用了Tkinter图形用户界面库来提供直观的用户体验。它不仅可以浏览单个文件夹中的图片,还能遍历包含多个子文件夹的复杂文件夹结构,并逐个显示每个子文件夹中的图片。
主要功能
-
遍历子文件夹: 用户可以指定一个包含多个子文件夹的总文件夹。程序将自动进入每个子文件夹并显示其中的图片。
-
全屏显示: 双击任意图片,可以在全屏模式下查看。
-
键盘导航: 使用键盘的左右箭头键可以在图片之间前后切换。按下
Delete
键可以删除当前显示的图片。 -
智能提示: 当用户查看完一个子文件夹中的所有图片后,程序会显示提示信息。在最后一个文件夹的最后一张图片后,会出现结束提示。
-
容错处理: 程序能够处理空的子文件夹或子文件夹中的非图像文件,自动跳过它们,确保用户体验的连贯性和程序的稳定性。
技术细节
- 开发语言: Python
- 图形界面库: Tkinter
- 图像处理: Pillow库用于加载和显示图片
使用方法
用户启动程序后,会被要求输入一个包含图片的总文件夹路径。程序接着开始从第一个子文件夹的第一张图片进行显示。用户可以通过键盘操作在图片间切换,或删除当前显示的图片。当遍历完一个子文件夹后,会收到提示,并可以继续浏览下一个子文件夹的图片。
import os import tkinter as tk from tkinter import simpledialog, messagebox from PIL import Image, ImageTk class ImageViewer(tk.Tk): def __init__(self): super().__init__() # Initialize variables self.all_images = [] self.current_folder_index = 0 self.current_image_index = 0 self.img_label = tk.Label(self) self.img_label.pack(expand=True) # Full screen setup self.attributes('-fullscreen', True) self.bind('<Escape>', lambda e: self.quit()) self.bind('<Left>', self.show_prev_image) self.bind('<Right>', self.show_next_image) self.bind('<Delete>', self.delete_image) self.bind('<Double-1>', self.toggle_fullscreen) # Load images from folders self.load_images() def load_images(self): base_folder = simpledialog.askstring("Input", "Enter the path of the base folder:") if not base_folder or not os.path.isdir(base_folder): messagebox.showerror("Error", "Invalid folder path.") self.quit() return for folder in sorted(os.listdir(base_folder)): folder_path = os.path.join(base_folder, folder) if os.path.isdir(folder_path): images = [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))] if images: self.all_images.append(images) if self.all_images: self.show_image(self.current_folder_index, self.current_image_index) else: messagebox.showinfo("No Images", "No images found in the provided folder structure.") self.quit() def show_image(self, folder_index, image_index): if folder_index < len(self.all_images) and image_index < len(self.all_images[folder_index]): self.current_image_index = image_index self.current_folder_index = folder_index image = Image.open(self.all_images[folder_index][image_index]) photo = ImageTk.PhotoImage(image) self.img_label.config(image=photo) self.img_label.image = photo elif folder_index < len(self.all_images): messagebox.showinfo("End of Folder", "End of current folder. Press 'Right' to go to the next folder.") else: messagebox.showinfo("End of Gallery", "You have reached the end of the gallery.") self.quit() def show_next_image(self, event=None): if self.current_image_index < len(self.all_images[self.current_folder_index]) - 1: self.show_image(self.current_folder_index, self.current_image_index + 1) elif self.current_folder_index < len(self.all_images) - 1: self.current_folder_index += 1 self.current_image_index = 0 self.show_image(self.current_folder_index, self.current_image_index) def show_prev_image(self, event=None): if self.current_image_index > 0: self.show_image(self.current_folder_index, self.current_image_index - 1) elif self.current_folder_index > 0: self.current_folder_index -= 1 self.current_image_index = len(self.all_images[self.current_folder_index]) - 1 self.show_image(self.current_folder_index, self.current_image_index) def delete_image(self, event=None): current_image_path = self.all_images[self.current_folder_index][self.current_image_index] os.remove(current_image_path) del self.all_images[self.current_folder_index][self.current_image_index] if len(self.all_images[self.current_folder_index]) == 0: del self.all_images[self.current_folder_index] if self.current_folder_index >= len(self.all_images): self.quit() return self.show_next_image() def toggle_fullscreen(self, event=None): self.attributes('-fullscreen', not self.attributes('-fullscreen')) if __name__ == "__main__": app = ImageViewer() app.mainloop()
标签:index,查看器,Python,self,current,图像,images,folder,image From: https://www.cnblogs.com/zly324/p/17972042