[macOS Catalina 10.15.7]
結構重宝しているファイル削除ツールをアップデートしました。
削除するファイル数が多いと処理完了のタイミングがわからないので、GUI上にメッセージを表示すると同時にデスクトップ通知を送るようにしました。
簡単なツールやスクレイピング関連アプリはこれまで通りPythonのtkinterで、 MySQL関連など本格的に仕上げたい場合はJavaのSwingあるいはJavaFXで作成するつもりです。
tkinterで作成するGUIは今ひとつモダンな感じがしませんが、ツール類はともかくスクレイピングのコードをJavaで書くのはかなりの難行と思われるため大人しくtkinterにしておきます。
import glob,os,shutil,sys
import tkinter as tk
import tkinter.font as font
from tkinter import ttk
def list_text():
# フレーム内全ウィジェットのinfoを取得
children = frame.winfo_children()
text_list = [entry for entry in children if type(entry)==tk.Text]
print(f'textのみ抽出\n{text_list}\n')
return text_list
class FrameB(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.configure(background = '#FFFACD')
self.grid(row=1,column=1, sticky=tk.NSEW, padx=5, pady=5)
# Macのデスクトップ通知
def notification1():
os.system("osascript -e 'display notification \"フォルダ削除\n処理完了\"'")
def notification2():
os.system("osascript -e 'display notification \"ファイル削除\n処理完了\"'")
# 色
# '#98fb98','#8b0000','#808000','#FF7F50','#00FA9A','#9370DB','#40E0D0','#FFFACD'
root = tk.Tk()
root.title("FILE REMOVER v0.0.2")
root.geometry("420x200")
root.configure(bg='#FFFACD')
# 設定
my_font = font.Font(root,family="System",size=18,weight="normal")
my_font2 = font.Font(root,family="System",size=16,weight="normal")
# フレームの作成・配置
frame = tk.Frame(root,background = '#FFFACD')
frame.grid(row=0,column=0, sticky=tk.NSEW, padx=5, pady=10)
frameB = FrameB(master=frame)
# ラベルの作成・配置
label = tk.Label(frame,text='PATH',background = '#FFFACD',foreground = '#8b0000',font=my_font)
label.grid(row=0, column=0)
# パス入力エントリの作成・配置
entry = tk.Entry(frame,width=25,background = '#98fb98',foreground = '#8b0000',font=my_font)
entry.grid(row=0,column=1,sticky=tk.W)
# 実行ボタンの作成・配置
var_act = tk.IntVar()
btn = tk.Button(frame, text="削除",command=lambda:var_act.set(1),width=2,font=my_font)
btn.grid(row=0,column=2,padx=2)
# ラジオボタンの作成・配置 FrameBにパックして左に詰め込む
var = tk.IntVar()
rb1 = ttk.Radiobutton(frameB,text='フォルダ',value=1,variable=var)
rb1.pack(padx=30,side=tk.LEFT)
rb2 = ttk.Radiobutton(frameB,text='ファイル',value=2,variable=var)
rb2.pack(padx=30,side=tk.LEFT)
# メッセージボックスの作成・配置
msg_box = tk.Text(frame,width=25,height=5,background = '#98fb98',foreground = '#8b0000',font=my_font)
msg_box.grid(row=2,column=1)
# クリアボタンの作成・配置
btn2 = tk.Button(frame, text="クリア",command=lambda:[entry.delete(0,tk.END),text_list[0].delete('1.0',tk.END)],width=2,font=my_font)
btn2.grid(row=1,column=2,padx=2)
text_list = list_text()
print(text_list)
for i in range(100): # 100回処理可能
# フォルダパスの入力を待機
btn.wait_variable(var_act)
# 入力したフォルダパスを取得
dirpath = entry.get()
# ラジオボタンのvalueを取得
v = var.get()
if v == 1:
path = dirpath + '/*' # 直下のフォルダを削除
for f in glob.glob(path,recursive=True):
if os.path.isdir(f):
shutil.rmtree(f)
text_list[0].delete('1.0',tk.END)
text_list[0].insert(tk.END,dirpath+'\n')
text_list[0].insert(tk.END,'フォルダ削除完了')
notification1()
else:
path = dirpath + '/**' # 再帰的処理により下層ファイルも削除
for f in glob.glob(path, recursive=True):
if os.path.isfile(f):
os.remove(f)
text_list[0].delete('1.0',tk.END)
text_list[0].insert(tk.END,dirpath+'\n')
text_list[0].insert(tk.END,'ファイル削除完了')
notification2()
root.mainloop()