フォルダ作成ツール『序列の連鎖(セイント・インデクシング)』ver.0.4.0 ソースコード

『序列の連鎖(セイント・インデクシング)』ver.0.4.0 のソースコード全文です:

>>最新版

 
        import os
        import tkinter as tk
        from tkinter import filedialog, messagebox
        
        class FolderMakerApp:
            def __init__(self, root):
                self.root = root
                self.root.title("フォルダ作成ツール - 序列の連鎖(セイント・インデクシング)")
        
                self.default_folder_count = 10
                self.max_folder_limit = 100
        
                # 対象フォルダ
                self.path_label = tk.Label(root, text="対象フォルダ:")
                self.path_label.pack(anchor='w', padx=10, pady=(10, 0))
        
                path_frame = tk.Frame(root)
                path_frame.pack(fill='x', padx=10)
                self.path_entry = tk.Entry(path_frame, width=50)
                self.path_entry.pack(side='left', expand=True, fill='x')
                tk.Button(path_frame, text="参照", command=self.browse_folder).pack(side='left', padx=5)
        
                # サブフォルダ構成
                tk.Label(root, text="作成するサブフォルダ(改行区切り、階層は \\ で指定):").pack(anchor='w', padx=10, pady=(10, 0))
                self.subfolder_text = tk.Text(root, height=8)
                self.subfolder_text.pack(fill='both', expand=True, padx=10)
        
                # フォルダ名の接頭辞
                prefix_frame = tk.Frame(root)
                prefix_frame.pack(anchor='w', padx=10, pady=(10, 0))
                tk.Label(prefix_frame, text="フォルダ名の接頭辞(任意):").pack(side='left')
                self.prefix_var = tk.StringVar()
                tk.Entry(prefix_frame, textvariable=self.prefix_var, width=20).pack(side='left')
        
                # 作成フォルダ数
                count_frame = tk.Frame(root)
                count_frame.pack(anchor='w', padx=10, pady=(10, 0))
                self.folder_count_label_var = tk.StringVar()
                self.update_folder_count_label()
                tk.Label(count_frame, textvariable=self.folder_count_label_var).pack(side='left')
        
                self.folder_count_var = tk.StringVar(value=str(self.default_folder_count))
                tk.Entry(count_frame, textvariable=self.folder_count_var, width=5).pack(side='left', padx=5)
        
                # ボタン
                button_frame = tk.Frame(root)
                button_frame.pack(pady=15)
                tk.Button(button_frame, text="上限設定", command=self.open_settings).pack(side='left', padx=10)
                tk.Button(button_frame, text="実行", command=self.execute_creation).pack(side='left', padx=10)
        
            def update_folder_count_label(self):
                self.folder_count_label_var.set(f"作成フォルダ数(1~{self.max_folder_limit}):")
        
            def browse_folder(self):
                folder_path = filedialog.askdirectory()
                if folder_path:
                    self.path_entry.delete(0, tk.END)
                    self.path_entry.insert(0, folder_path)
        
            def execute_creation(self):
                base_path = self.path_entry.get().strip()
                subfolders_raw = self.subfolder_text.get("1.0", tk.END).strip()
                prefix = self.prefix_var.get().strip()
        
                try:
                    count = int(self.folder_count_var.get())
                    if not (1 <= count <= self.max_folder_limit):
                        raise ValueError
                except ValueError:
                    messagebox.showerror("入力エラー", f"フォルダ数は1~{self.max_folder_limit}の整数で指定してください。")
                    return
        
                if not base_path or not os.path.isdir(base_path):
                    messagebox.showerror("エラー", "有効な対象フォルダを選択してください。")
                    return
        
                if not subfolders_raw:
                    messagebox.showerror("エラー", "サブフォルダ構成を入力してください。")
                    return
        
                subfolder_list = [line.strip() for line in subfolders_raw.splitlines() if line.strip()]
        
                confirm = messagebox.askokcancel(
                    "確認",
                    f"{count}個のフォルダ(接頭辞: '{prefix}')を作成します。\n本当に実行しますか?"
                )
                if not confirm:
                    return
        
                try:
                    for i in range(1, count + 1):
                        folder_name = f"{prefix}{i:03d}"
                        target_path = os.path.join(base_path, folder_name)
                        for sub in subfolder_list:
                            full_path = os.path.join(target_path, *sub.split("\\"))
                            os.makedirs(full_path, exist_ok=True)
                    messagebox.showinfo("完了", "フォルダの作成が完了しました。")
                except Exception as e:
                    messagebox.showerror("エラー", f"フォルダ作成中にエラーが発生しました:\n{e}")
        
            def open_settings(self):
                settings_win = tk.Toplevel(self.root)
                settings_win.title("設定")
                settings_win.geometry("300x180")
                settings_win.resizable(False, False)
        
                tk.Label(settings_win, text="デフォルトの作成フォルダ数(1~上限):").pack(pady=(15, 5))
                default_var = tk.StringVar(value=str(self.default_folder_count))
                default_entry = tk.Entry(settings_win, textvariable=default_var, width=5)
                default_entry.pack()
        
                tk.Label(settings_win, text="作成フォルダ数の上限(最大100):").pack(pady=(15, 5))
                limit_var = tk.StringVar(value=str(self.max_folder_limit))
                limit_entry = tk.Entry(settings_win, textvariable=limit_var, width=5)
                limit_entry.pack()
        
                def save_settings():
                    try:
                        new_limit = int(limit_var.get())
                        new_default = int(default_var.get())
                        if not (1 <= new_limit <= 100):
                            raise ValueError("上限は1~100の間で指定してください。")
                        if not (1 <= new_default <= new_limit):
                            raise ValueError("デフォルト値は1以上、かつ上限以下である必要があります。")
        
                        self.max_folder_limit = new_limit
                        self.default_folder_count = new_default
                        self.folder_count_var.set(str(new_default))
                        self.update_folder_count_label()
                        settings_win.destroy()
        
                    except ValueError as ve:
                        messagebox.showerror("エラー", str(ve), parent=settings_win)
        
                tk.Button(settings_win, text="保存", command=save_settings).pack(pady=15)
        
        # 実行
        if __name__ == "__main__":
            root = tk.Tk()
            app = FolderMakerApp(root)
            root.mainloop()