带计数器的看图软件

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.total_image_count = 0

        # 设置背景为黑色
        self.configure(bg='black')

        # 设置图片计数器(放置在左上角)
        self.counter_label = tk.Label(self, text="", fg="white", bg="black", anchor="nw")
        self.counter_label.pack(side='top', anchor='nw', padx=10, pady=10)

        # 设置图片标签
        self.img_label = tk.Label(self, bg='black')
        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)
                    self.total_image_count += len(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 update_counter(self):
        current_position = sum(len(folder) for folder in self.all_images[:self.current_folder_index]) + self.current_image_index + 1
        self.counter_label.config(text=f"{current_position}/{self.total_image_count}")

    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
            self.update_counter()
        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]
        self.total_image_count -= 1
        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 @ 2024-01-18 15:07  不上火星不改名  阅读(38)  评论(0)    收藏  举报