Python写文件粉碎机

crush.py


import tkinter as tk
from tkinter import ttk
import os
import windnd
from threading import Thread
import shutil

root = tk.Tk()
root.title("文件粉碎机--微信公众号:蓝胖子之家")
root.geometry("612x288")
root.resizable(False, False)
root.iconbitmap("icon.ico")

# 自定义字体
font_style = "Courier New"

# 创建并布局label_warning、label_volume、text、btn_execute等组件

label_warning = tk.Label(root, text="注意:请在粉碎文件之前关闭相关的文件或程序,否则可能会出现错误。", foreground="red", font=(font_style, 12, "bold"))
label_warning.pack()

label_volume = tk.Label(root, text="文件数量:0\t文件夹数量:0\t总数据:0\n执行成功:0\t异常文件:0", font=(font_style, 12))
label_volume.pack(pady=20)

text = tk.Text(root, width=84, height=6, font=(font_style, 12), bg="#EFEFEF")
text.pack(padx=10, pady=10)
text.insert("insert", "将要粉碎的文件拖拽到此处!")
text.configure(state="disabled")

files_A = []
folder_A = []
folder_B = []
G = []

def handle_drag(files):
    global files_A, folder_A, folder_B, G
    files_A = []
    folder_A = []
    folder_B = []
    G = []

    text.configure(state="normal")
    text.delete("1.0", "end")

    for file in files:
        file = file.decode("gbk")
        if os.path.isfile(file):
            text.insert("insert", file.replace("\\", "/") + "\n")
            files_A.append(file.replace("\\", "/"))
        else:
            folder_A.append(file)

    for folder in folder_A:
        for a in os.walk(folder.replace("\\", "/")):
            folder_B = [a[0].replace("\\", "/")] + folder_B
            for file in a[2]:
                text.insert("insert", os.path.join(a[0], file).replace("\\", "/") + "\n")
                files_A.append(os.path.join(a[0], file).replace("\\", "/"))

    for folder in folder_B:
        text.insert("insert", folder + "\n")

    label_volume.config(text=f"文件数量:{len(files_A)}\t文件夹数量:{len(folder_B)}\t总数据:{len(files_A)+len(folder_B)}\n执行成功:0\t异常文件:0")
    text.configure(state="disabled")


def delete_file(file):
    global G
    if os.path.isfile(file):
        try:
            with open(file, "w") as f:
                f.write("1")
            os.remove(file)
            text.configure(state="normal")
            text.insert("insert", "· 处理完成 >>" + file + "\n")
            text.see(tk.END)
            text.configure(state="disabled")
        except:
            try:
                os.remove(file)
            except:
                G.append("【异常未处理】 >>" + file)
    else:
        G.append("【异常未处理】 >>" + file)


def delete_folder(folder):
    global G
    if os.path.isfile(folder) == False:
        if os.path.exists(folder):
            try:
                shutil.rmtree(folder)
                text.configure(state="normal")
                text.insert("insert", "· 处理完成 >>" + folder + "\n")
                text.see(tk.END)
                text.configure(state="disabled")
            except:
                G.append("【异常未处理】 >>" + folder)
        else:
            G.append("【异常未处理】 >>" + folder)
    else:
        G.append("【异常未处理】 >>" + folder)


def execute():
    def task():
        global folder_B
        if btn_execute["state"] == "disabled":
            return
        else:
            text.configure(state="normal")
            text.delete("1.0", "end")
            text.configure(state="disabled")
            btn_execute["state"] = "disabled"

            for file in files_A:
                delete_file(file)

            for folder in folder_B:
                delete_folder(folder)

            for item in G:
                text.configure(state="normal")
                text.insert("insert", f"{item}\n")
                text.see(tk.END)
                text.configure(state="disabled")

            label_volume.config(text=f"文件数量:{len(files_A)}\t文件夹数量:{len(folder_B)}\t总数据:{len(files_A)+len(folder_B)}\n执行成功:{len(files_A)+len(folder_B)-len(G)}\t异常文件:{len(G)}")
            btn_execute["state"] = "normal"

    Thread(target=task).start()

btn_execute = tk.Button(root, text="一键粉碎", width=20, command=execute, font=(font_style, 12), foreground="#FFFFFF", background="#0055FF")
btn_execute.pack(pady=10)


windnd.hook_dropfiles(root, func=handle_drag)

# 自定义按钮样式
style = ttk.Style()
style.configure("Custom.TButton", font=(font_style, 12), foreground="#FFFFFF", background="#0055FF", padding=8)

root.mainloop()

首先,导入了必要的库,包括tkinter、ttk、os、windnd和shutil。然后创建了一个根窗口对象root,并设置了窗口的标题、大小、不可调整大小和图标。

接下来,定义了自定义字体样式font_style,并创建了一些界面组件,包括label_warning(用于显示警告信息)、label_volume(用于显示文件数量和执行结果)、text(用于显示文件路径)、btn_execute(用于执行文件粉碎操作)等。

在handle_drag函数中,定义了处理拖拽文件的逻辑。它首先清空text中的内容,然后遍历拖拽的文件列表,将文件路径添加到files_A列表中。如果拖拽的是文件夹,还会将文件夹路径添加到folder_A列表中,并遍历文件夹中的所有文件,将文件路径添加到files_A列表中。最后,将文件夹路径添加到folder_B列表中,并在text中显示文件和文件夹的路径。

在delete_file函数中,定义了删除文件的逻辑。如果文件存在,先尝试以写入方式打开文件,并写入一个字符,然后删除文件。如果删除失败,将文件路径添加到G列表中。

在delete_folder函数中,定义了删除文件夹的逻辑。如果文件夹不存在,直接将文件夹路径添加到G列表中。如果文件夹存在,尝试递归删除文件夹。如果删除失败,将文件夹路径添加到G列表中。

在execute函数中,定义了执行文件粉碎操作的逻辑。首先禁用btn_execute按钮,并清空text中的内容。然后遍历files_A列表,调用delete_file函数删除文件。接着遍历folder_B列表,调用delete_folder函数删除文件夹。最后,将G列表中的异常文件信息显示在text中,并更新label_volume的文本。最后再启用btn_execute按钮。

最后,设置了拖拽文件的处理函数handle_drag,并启动主事件循环root.mainloop()。

将粉碎的文件拖进窗口,一件粉碎即

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值