Image renameing tool from alphabetical order to numerical order

Here you can slect a particular image or whole folder to rename them in numerical order from alphabetical order.

Source code:

import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk

class PhotoRenamer:
    def _init_(self, root):
        self.root = root
        self.root.title("Student Photo Serial Renamer (2026)")
        self.root.geometry("600x400")
       
        self.selected_files = [] # Stores full paths of images to rename
        self.start_num_var = tk.StringVar(value="1")
       
        self.create_widgets()

    def create_widgets(self):
        main_frame = ttk.Frame(self.root, padding="20")
        main_frame.pack(fill="both", expand=True)

        # 1. Selection Buttons
        ttk.Label(main_frame, text="1. Choose Your Photos:", font=('Helvetica', 10, 'bold')).grid(row=0, column=0, sticky="w", pady=5)
       
        btn_frame = ttk.Frame(main_frame)
        btn_frame.grid(row=1, column=0, columnspan=2, sticky="w")
       
        ttk.Button(btn_frame, text="Select Folder (All JPGs)", command=self.browse_folder).pack(side="left", padx=5)
        ttk.Button(btn_frame, text="Select Specific Images", command=self.browse_images).pack(side="left", padx=5)

        # 2. File List Display
        ttk.Label(main_frame, text="Selected Files:").grid(row=2, column=0, sticky="w", pady=(15, 5))
        self.file_listbox = tk.Listbox(main_frame, height=8, width=70)
        self.file_listbox.grid(row=3, column=0, columnspan=2, sticky="ew")

        # 3. Rename Settings
        settings_frame = ttk.Frame(main_frame)
        settings_frame.grid(row=4, column=0, sticky="w", pady=15)
       
        ttk.Label(settings_frame, text="Starting Serial Number:").pack(side="left")
        ttk.Entry(settings_frame, textvariable=self.start_num_var, width=10).pack(side="left", padx=10)

        # 4. Action Button
        self.run_btn = ttk.Button(main_frame, text="RENAME NOW", command=self.start_renaming, state="disabled")
        self.run_btn.grid(row=5, column=0, columnspan=2, pady=10)

    def update_listbox(self):
        self.file_listbox.delete(0, tk.END)
        # Sort files alphabetically by their filename (not full path) before displaying
        self.selected_files.sort(key=lambda x: os.path.basename(x).lower())
       
        for f in self.selected_files:
            self.file_listbox.insert(tk.END, os.path.basename(f))
       
        if self.selected_files:
            self.run_btn.config(state="normal")
        else:
            self.run_btn.config(state="disabled")

    def browse_folder(self):
        folder = filedialog.askdirectory()
        if folder:
            # Get all JPG/JPEG files from that folder
            self.selected_files = [os.path.join(folder, f) for f in os.listdir(folder)
                                   if f.lower().endswith(('.jpg', '.jpeg'))]
            self.update_listbox()

    def browse_images(self):
        files = filedialog.askopenfilenames(filetypes=[("Image files", "*.jpg *.jpeg")])
        if files:
            self.selected_files = list(files)
            self.update_listbox()

    def start_renaming(self):
        try:
            start_num = int(self.start_num_var.get())
        except ValueError:
            messagebox.showerror("Error", "Please enter a valid starting number.")
            return

        if not messagebox.askyesno("Confirm", f"Rename {len(self.selected_files)} images?"):
            return

        success_count = 0
        try:
            # Use a temporary list to avoid conflicts during renaming
            for index, old_path in enumerate(self.selected_files):
                directory = os.path.dirname(old_path)
                extension = os.path.splitext(old_path)[1]
               
                # Create the new filename (e.g., 1.jpg, 2.jpg)
                # Tip: use f"{start_num + index:03}{extension}" for leading zeros (001, 002)
                new_filename = f"{start_num + index}{extension}"
                new_path = os.path.join(directory, new_filename)

                # Rename the file
                os.rename(old_path, new_path)
                success_count += 1

            messagebox.showinfo("Done", f"Successfully renamed {success_count} images!")
            self.selected_files = [] # Clear list after completion
            self.update_listbox()
           
        except Exception as e:
            messagebox.showerror("System Error", f"Failed to rename: {e}")

if __name__ == "_main_":
    root = tk.Tk()
    app = PhotoRenamer(root)
    root.mainloop()

Comments