ChatGPT+Python 小説版 読者特典

プログラムのソース

プログラム本体(zip形式)

import os
import csv
import tkinter as tk
from tkinter import filedialog, messagebox, Toplevel, Text

# ファイルを検索する関数
def search_files(directory, keywords):
    files_list = []
    for foldername, subfolders, filenames in os.walk(directory):
        for filename in filenames:
            # すべてのキーワードが含まれるかチェック
            if all(keyword in filename for keyword in keywords if keyword):
                full_path = os.path.join(foldername, filename)
                files_list.append(full_path)
    return files_list

# CSVファイルに保存する関数
def save_to_csv(data, output_filename):
    with open(output_filename, 'w', newline='', encoding='shift_jis') as csvfile:
        csvwriter = csv.writer(csvfile)
        for row in data:
            csvwriter.writerow([row])

# ファイルを開く関数
def open_file(event):
    filepath = event.widget.tag_dict['filepath']
    os.startfile(filepath)

# 検索結果を表示する関数
def display_results(files_list):
    results_window = Toplevel(app)
    results_window.title("検索結果")
    
    # スクロールバー付きキャンバスの作成
    canvas = tk.Canvas(results_window)
    scrollbar = tk.Scrollbar(results_window, orient="vertical", command=canvas.yview)
    results_frame = tk.Frame(canvas)
    
    canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox('all')))
    canvas.create_window((0,0), window=results_frame, anchor="nw")
    canvas.configure(yscrollcommand=scrollbar.set)

    # ファイルパスを表示
    for filepath in files_list:
        link_label = tk.Label(results_frame, text=filepath, fg="blue", cursor="hand2")
        link_label.tag_dict = {'filepath': filepath}
        link_label.bind("<Button-1>", open_file)
        link_label.pack(anchor="w", padx=10, pady=5)
    
    canvas.pack(side="left", fill="both", expand=True)
    scrollbar.pack(side="right", fill="y")

# 検索と保存を行う関数
def search_and_save():
    directory = folder_var.get()
    keywords = [keyword_var1.get(), keyword_var2.get(), keyword_var3.get()]
    output_filename = output_file_var.get()
    files_list = search_files(directory, keywords)
    save_to_csv(files_list, output_filename)
    file_count = len(files_list)
    display_results(files_list)
    messagebox.showinfo("Information", f"{file_count} 個のファイルを検索しました。")

# フォルダ選択ダイアログを開く関数
def select_folder():
    folder = filedialog.askdirectory()
    if folder:
        folder_var.set(folder)

# GUIの作成とウィジェットの配置
app = tk.Tk()
app.title("ファイル検索ツール")
app.geometry("600x450")

# フォルダ指定の部分
folder_label = tk.Label(app, text="フォルダの指定:")
folder_label.pack(pady=10)
folder_var = tk.StringVar()
folder_var.set("E:\\OneDrive\\OneDrive - cvppv\\デスクトップ\\stable-diffusion-webui\\outputs")
folder_entry = tk.Entry(app, textvariable=folder_var, width=70)
folder_entry.pack(pady=5)
select_button = tk.Button(app, text="フォルダ選択", command=select_folder)
select_button.pack(pady=5)

# キーワード入力の部分
keyword_label = tk.Label(app, text="検索キーワード:")
keyword_label.pack(pady=10)
keyword_var1 = tk.StringVar()
keyword_entry1 = tk.Entry(app, textvariable=keyword_var1, width=70)
keyword_entry1.pack(pady=5)
keyword_var2 = tk.StringVar()
keyword_entry2 = tk.Entry(app, textvariable=keyword_var2, width=70)
keyword_entry2.pack(pady=5)
keyword_var3 = tk.StringVar()
keyword_entry3 = tk.Entry(app, textvariable=keyword_var3, width=70)
keyword_entry3.pack(pady=5)

# 出力ファイル名の指定
output_file_label = tk.Label(app, text="出力ファイル名 (フルパス):")
output_file_label.pack(pady=10)
output_file_var = tk.StringVar()
output_file_entry = tk.Entry(app, textvariable=output_file_var, width=70)
output_file_entry.pack(pady=5)

# 検索開始ボタン
start_button = tk.Button(app, text="検索開始", command=search_and_save, bg='blue', fg='white', font=("Arial", 12))
start_button.pack(pady=20)

# GUIの実行
app.mainloop()