pip install pyminizip
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import zipfile
import pyminizip
class FileCompressorApp:
def __init__(self, root):
self.root = root
self.root.title("File Compression Tool 🗜️")
self.root.geometry("450x300")
self.files = []
self.label = tk.Label(root, text="Drag and Drop Files or Use 'Browse'", font=("Helvetica", 12))
self.label.pack(pady=10)
self.file_listbox = tk.Listbox(root, width=50, height=8)
self.file_listbox.pack()
self.browse_button = tk.Button(root, text="Browse Files", command=self.browse_files)
self.browse_button.pack(pady=5)
self.password_label = tk.Label(root, text="Password (optional):")
self.password_label.pack()
self.password_entry = tk.Entry(root, show="*")
self.password_entry.pack(pady=2)
self.compress_button = tk.Button(root, text="Compress to ZIP", command=self.compress_files)
self.compress_button.pack(pady=10)
def browse_files(self):
paths = filedialog.askopenfilenames()
for path in paths:
if path not in self.files:
self.files.append(path)
self.file_listbox.insert(tk.END, path)
def compress_files(self):
if not self.files:
messagebox.showerror("No Files", "Please select files to compress.")
return
zip_path = filedialog.asksaveasfilename(defaultextension=".zip", filetypes=[("ZIP files", "*.zip")])
if not zip_path:
return
password = self.password_entry.get()
try:
if password:
# Use pyminizip for password protection
compression_level = 5
pyminizip.compress_multiple(self.files, [], zip_path, password, compression_level)
else:
# Use zipfile for normal compression
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zipf:
for file in self.files:
arcname = os.path.basename(file)
zipf.write(file, arcname)
messagebox.showinfo("Success", f"Files compressed successfully to:\n{zip_path}")
except Exception as e:
messagebox.showerror("Error", f"Compression failed:\n{str(e)}")
if __name__ == "__main__":
root = tk.Tk()
app = FileCompressorApp(root)
root.mainloop()