『序列の連鎖(セイント・インデクシング)』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()