ChatGPT+Python 小説版 読者特典
プログラムのソース
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()