Python 图像查看器


当然,这里是一个简洁而全面的介绍,适合用于在博客中介绍这个图像查看器程序:


Python 图像查看器

在这篇博客中,我将向大家介绍一个由我开发的简单但功能强大的图像查看器。这个图像查看器是用Python编写的,利用了Tkinter图形用户界面库来提供直观的用户体验。它不仅可以浏览单个文件夹中的图片,还能遍历包含多个子文件夹的复杂文件夹结构,并逐个显示每个子文件夹中的图片。

主要功能

  1. 遍历子文件夹: 用户可以指定一个包含多个子文件夹的总文件夹。程序将自动进入每个子文件夹并显示其中的图片。

  2. 全屏显示: 双击任意图片,可以在全屏模式下查看。

  3. 键盘导航: 使用键盘的左右箭头键可以在图片之间前后切换。按下 Delete 键可以删除当前显示的图片。

  4. 智能提示: 当用户查看完一个子文件夹中的所有图片后,程序会显示提示信息。在最后一个文件夹的最后一张图片后,会出现结束提示。

  5. 容错处理: 程序能够处理空的子文件夹或子文件夹中的非图像文件,自动跳过它们,确保用户体验的连贯性和程序的稳定性。

技术细节

  • 开发语言: 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()
复制代码

 

posted @   不上火星不改名  阅读(224)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示