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

以下は『序列の連鎖(セイント・インデクシング)』の最新版ソースコード全文です:

 
        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))
                vcmd = (root.register(self.validate_folder_count), '%P')
                tk.Entry(count_frame, textvariable=self.folder_count_var, width=5, validate='key', validatecommand=vcmd).pack(side='left', padx=5)
        
                # ボタン(「上限設定」ボタンは削除済)
                button_frame = tk.Frame(root)
                button_frame.pack(pady=15)
                tk.Button(button_frame, text="実行", command=self.execute_creation).pack(side='left', padx=10)
        
                # バージョン表記
                version_label = tk.Label(root, text="version 1.3.0", font=("Arial", 8), fg="gray")
                version_label.pack(side='bottom', pady=5)
        
            def update_folder_count_label(self):
                self.folder_count_label_var.set(f"作成フォルダ数(1~{self.max_folder_limit}):")
        
            def validate_folder_count(self, value):
                if value == "":
                    return True
                try:
                    val = int(value)
                    return 1 <= val <= self.max_folder_limit
                except ValueError:
                    return False
        
            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
        
                # サブフォルダなしでも許容
                subfolder_list = [line.strip() for line in subfolders_raw.splitlines() if line.strip()] if subfolders_raw else []
        
                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)
                        if subfolder_list:
                            for sub in subfolder_list:
                                full_path = os.path.join(target_path, *sub.split("\\"))
                                os.makedirs(full_path, exist_ok=True)
                        else:
                            os.makedirs(target_path, exist_ok=True)
                    messagebox.showinfo("完了", "フォルダの作成が完了しました。")
                except Exception as e:
                    messagebox.showerror("エラー", f"フォルダ作成中にエラーが発生しました:\n{e}")
        
        # 実行
        if __name__ == "__main__":
            root = tk.Tk()
            
            ##タイトルバーアイコン表示用
            data = '''R0lGODlhEAAQAOenAA0IAhEMAQ4NCw8NCw4ODw0OEw8ODA4OEQ8PDg4PEg8PEg4Q
                    FA8QEw8QFA8RFQ8RFg8RFxARFA8SFg8SGA8SGRASFhISDxESExATGhATHBAUGhAU
                    GxAUHBEUGRAUHREUGxEUHBQUEhAVHRAVHhEVGxEVHBEVHRIVGxEVHxUVEhUVExEW
                    HREWHhEWHxEWIBUXExIXIBUYGRMZIRQaIxUdJxYdJRYeJhchLRgiLxgjNRkmOBom
                    NhknPhgoPhoqQB0tQR8uPxwvUwMxtwAywwAyxQAzxgE0wAI1vwA1yQI1wgE4ywI4
                    ygA41AI5yhw5ayE5WQY5xCE5YgE6zQI6ywI6zCI6WAk6vCI8ZgE93CI9awA+3x4/
                    cSI/ZgE/6Ao/yABA4QBB4gBB4xpBkiFCfwxC0SFDeSZDcAVE4iJFeRVFsxBHxw5H
                    zw1H1R5JnB5JngVK8R9KngVL8xNL0CJLmiBNoyJNnxRP0hJR4hVS2BZT1hdU1hFV
                    4xZV2RRW4hdW3BxWzhRX5SdXqRRY5SZYqxJa6BZa4hha4Bta3Bpb3hxb2CxbpBlc
                    3x5c2Rdd5xRe7Rpd5x1f1yBf3Bpg6Rhh7h1g7CFh3R9h6B5i5Blk8iNj3CFl4Sll
                    0CNm6CNn5SRn6SNo5CBp8S5qyCxr1SRs6iNs8SNt8Cdw7+6tl+6tl+6tl+6tl+6t
                    l+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6t
                    l+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6t
                    l+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6t
                    l+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6t
                    l+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6tl+6t
                    l+6tl+6tl+6tl+6tlyH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEKAP8ALAAAAAAQ
                    ABAAAAj8AD9seOBgQouDLARu+KDwQ4kbOGoMMCDggAmGCzdsaKBjESFIZbageXLB
                    RQmGJD4w4IGJzyFPnB4xCgKAw0mBDHqMsuJnT6M8dwZxsUFhxUIFPj5BmVRIT6VM
                    iCjNuQBhxYcEPyIVKaVGTh9BeMj8qULDgYkCQCydMeUFkCNDlzppIhVoBgYNMqKY
                    EaVEUiIhR4wkGbJmx4ISGwi82NQFlB0iS5Q0YZImRgYSJVicyDImFBskVKRMwSLG
                    AgoSqEFECKDojRYwYb7EcYKgBeoSJWBIuEKnDRw4burkqGACNWbMEVKoWK4iRIeT
                    xo2bGCGiugcR0KPj3s49JYmAADs=
                  ''' 
            root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(data=data))
            ####
        
            app = FolderMakerApp(root)
            root.mainloop()