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__() # 初始化变量 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) # 全屏设置 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('<d>', self.delete_folder) # 绑定d键以删除当前文件夹 self.bind('<Double-1>', self.toggle_fullscreen) # 从文件夹加载图片 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 delete_folder(self, event=None): # 获取当前图片所在的文件夹路径 current_folder_path = os.path.dirname(self.all_images[self.current_folder_index][self.current_image_index]) # 弹出确认删除的对话框 if messagebox.askyesno("Delete Folder", "Are you sure you want to delete the current folder and all its contents?"): # 删除文件夹及其所有内容 for root, dirs, files in os.walk(current_folder_path, topdown=False): for name in files: os.remove(os.path.join(root, name)) for name in dirs: os.rmdir(os.path.join(root, name)) os.rmdir(current_folder_path) # 从图片列表中删除该文件夹下的所有图片 del self.all_images[self.current_folder_index] self.total_image_count -= len(self.all_images[self.current_folder_index]) # 检查是否还有剩余的文件夹 if len(self.all_images) > 0: # 尝试显示下一个文件夹的第一张图片 if self.current_folder_index < len(self.all_images): self.current_image_index = 0 else: # 如果已经是最后一个文件夹,则回退到上一个文件夹的第一张图片 self.current_folder_index = max(0, len(self.all_images) - 1) self.current_image_index = 0 self.show_image(self.current_folder_index, self.current_image_index) else: self.quit() def toggle_fullscreen(self, event=None): self.attributes('-fullscreen', not self.attributes('-fullscreen')) if __name__ == "__main__": app = ImageViewer() app.mainloop()
标签:文件夹,index,删除,self,current,后进,images,folder,image From: https://www.cnblogs.com/zly324/p/18023688