Free GIF to PNG Converter




import tkinter as tk from tkinter import filedialog, messagebox, ttk from PIL import Image import os import threading class GIFtoPNGConverter: def __init__(self, root): self.root = root self.root.title("GIF to PNG Converter") self.root.geometry("500x300") self.root.resizable(False, False) # Variables self.input_files = [] self.output_folder = "" self.setup_ui() def setup_ui(self): # Main frame main_frame = ttk.Frame(self.root, padding="20") main_frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S)) # Title title_label = ttk.Label(main_frame, text="GIF to PNG Converter", font=("Arial", 16, "bold")) title_label.grid(row=0, column=0, columnspan=2, pady=(0, 20)) # Select GIF files button select_files_btn = ttk.Button(main_frame, text="Select GIF Files", command=self.select_files) select_files_btn.grid(row=1, column=0, sticky=(tk.W, tk.E), padx=(0, 10)) # Select output folder button select_folder_btn = ttk.Button(main_frame, text="Select Output Folder", command=self.select_output_folder) select_folder_btn.grid(row=1, column=1, sticky=(tk.W, tk.E)) # File list label files_label = ttk.Label(main_frame, text="Selected Files:") files_label.grid(row=2, column=0, sticky=tk.W, pady=(20, 5)) # File listbox with scrollbar list_frame = ttk.Frame(main_frame) list_frame.grid(row=3, column=0, columnspan=2, sticky=(tk.W, tk.E, tk.N, tk.S), pady=(0, 10)) self.file_listbox = tk.Listbox(list_frame, height=6) scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.file_listbox.yview) self.file_listbox.configure(yscrollcommand=scrollbar.set) self.file_listbox.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S)) scrollbar.grid(row=0, column=1, sticky=(tk.N, tk.S)) list_frame.columnconfigure(0, weight=1) list_frame.rowconfigure(0, weight=1) # Output folder label self.output_label = ttk.Label(main_frame, text="Output folder: Not selected") self.output_label.grid(row=4, column=0, columnspan=2, sticky=tk.W, pady=(5, 10)) # Progress bar self.progress = ttk.Progressbar(main_frame, mode='determinate') self.progress.grid(row=5, column=0, columnspan=2, sticky=(tk.W, tk.E), pady=(10, 5)) # Convert button self.convert_btn = ttk.Button(main_frame, text="Convert to PNG", command=self.start_conversion) self.convert_btn.grid(row=6, column=0, columnspan=2, pady=10) # Status label self.status_label = ttk.Label(main_frame, text="Ready") self.status_label.grid(row=7, column=0, columnspan=2) # Configure grid weights main_frame.columnconfigure(0, weight=1) main_frame.columnconfigure(1, weight=1) main_frame.rowconfigure(3, weight=1) def select_files(self): files = filedialog.askopenfilenames( title="Select GIF files", filetypes=[("GIF files", "*.gif"), ("All files", "*.*")] ) if files: self.input_files = list(files) self.update_file_list() def select_output_folder(self): folder = filedialog.askdirectory(title="Select output folder") if folder: self.output_folder = folder self.output_label.config(text=f"Output folder: {folder}") def update_file_list(self): self.file_listbox.delete(0, tk.END) for file in self.input_files: filename = os.path.basename(file) self.file_listbox.insert(tk.END, filename) def start_conversion(self): if not self.input_files: messagebox.showwarning("Warning", "Please select GIF files to convert.") return if not self.output_folder: messagebox.showwarning("Warning", "Please select an output folder.") return # Disable convert button during conversion self.convert_btn.config(state='disabled') # Start conversion in a separate thread to keep UI responsive thread = threading.Thread(target=self.convert_files) thread.daemon = True thread.start() def convert_files(self): total_files = len(self.input_files) converted_count = 0 errors = [] self.progress['maximum'] = total_files self.progress['value'] = 0 for i, input_file in enumerate(self.input_files): try: # Update status self.status_label.config(text=f"Converting {i+1}/{total_files}: {os.path.basename(input_file)}") # Open GIF with Image.open(input_file) as img: # Convert to RGB if necessary (GIFs can be palette mode) if img.mode in ('P', 'RGBA'): img = img.convert('RGBA') # Create output filename base_name = os.path.splitext(os.path.basename(input_file))[0] output_file = os.path.join(self.output_folder, f"{base_name}.png") # Save as PNG img.save(output_file, 'PNG') converted_count += 1 except Exception as e: errors.append(f"{os.path.basename(input_file)}: {str(e)}") # Update progress self.progress['value'] = i + 1 self.root.update_idletasks() # Show completion message if errors: error_msg = f"Conversion completed with {len(errors)} error(s):\n" + "\n".join(errors[:5]) if len(errors) > 5: error_msg += f"\n... and {len(errors) - 5} more errors" messagebox.showerror("Conversion Complete with Errors", error_msg) else: messagebox.showinfo("Success", f"All {converted_count} files converted successfully!") # Reset UI self.status_label.config(text="Ready") self.progress['value'] = 0 self.convert_btn.config(state='normal') def main(): root = tk.Tk() app = GIFtoPNGConverter(root) root.mainloop() if __name__ == "__main__": main()

Post a Comment

Previous Post Next Post