首页 > 其他分享 >看图软件(d删除后进下一个文件夹)

看图软件(d删除后进下一个文件夹)

时间:2024-02-20 17:58:26浏览次数:24  
标签:文件夹 index 删除 self current 后进 images folder image

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

相关文章

  • 【转】logback定期删除日志配置
    maxHistory:可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,,例如设置为3的话,则3天之后,旧的日志就会被删除。但是如果现在才配置,重启后,3天以前不会自动删掉。totalSizeCap:可选节点,用来指定日志文件的上限大小,例如设置为3GB的话,那么到了这个值,就会删除旧......
  • sql修改和删除
    --修改表名ALTERTABLE旧表名RENAMEAS新表名ALTERTABLEteacherRENAMEASteacher1--增加表的字段altertable表名add字段名字段属性ALTERTABLEteacher1ADDageINT(12)--修改表的字段(重命名,修改约束)--altertable表名modify字段名列属性ALTERTABLEtea......
  • IDEA使用过程中src文件夹显示不出来的解决方法
    IDEA加载项目没有src目录_idea导入项目没有src-CSDN博客总结:删除本地项目目录中的idea文件夹后重新打开项目......
  • linux 中 sed命令删除文本中指定位次的单词
     001、[root@pc1test1]#lsa.txt[root@pc1test1]#cata.txt##测试文本aabbcckkeessffuuzzvveeww##sed预存储抽取文件的第一列[root@pc1test1]#sed-r's/([a-Z]+)([^a-Z]+)([a-Z]+)([^a......
  • 看图软件带删除所在文件夹(d删除所在文件夹)
    importosimporttkinterastkfromtkinterimportsimpledialog,messageboxfromPILimportImage,ImageTkclassImageViewer(tk.Tk):def__init__(self):super().__init__()#初始化变量self.all_images=[]self.current_......
  • 磐维数据库自动添加/删除 分区脚本
    目录脚本功能脚本使用示例一、自动按天添加分区二、自动按天删除分区脚本功能磐维数据库自动按天添加/删除分区脚本使用示例一、自动按天添加分区1、shell脚本的内容panwei_add_partition.sh#!/bin/bash.~/.bash_profilefordbin"nlkf""nlkf1""nlkf2""nlkf3""nlk......
  • 代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树
    二叉搜索树的最近公共祖先 题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)思路:只要利用二叉搜索树特性,只要当前节点的值位于要求的两个节点之间,就必定是我们要找的节点。最简单的一集。classSolution{public:TreeNode*lowestCommonAncestor(TreeNode*root,......
  • 晚上调代码时写对拍程序之——为了不手写平衡树而乱搞的可支持随机访问、快速插入、快
    前言由于需要一个可支持随机访问、快速插入、快速删除的数据结构,但是我除了平衡树实在是想不到别的东西了,于是就乱搞出了一个这样的东西——abstract数组。但是,这玩意好像码量和平衡树差不多......不过!我认为她还是有优点的:相比起平衡树,她应该更不容易出锅?总之,不管怎么样,还是......
  • 代码随想录算法训练营第二十二天 | 450.删除二叉搜索树中的节点, 701.二叉搜索树中的
     450.删除二叉搜索树中的节点 已解答中等 相关标签相关企业 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点......
  • node--文件夹操作
    //文件夹的创建//fs.mkdir("./ztest",(err)=>{// if(err){//  console.log(err);// }else{//  console.log("文件夹创建成功");// }//});//递归创建//{recursive:true}//fs.mkdir("./ztest/ztest1",{recursive:true......