python学習：tkinterを使ってファイル起動・整理アプリを作ってみた　～Part4～

前回はファイル整理APPについての解説をしました。今回は「フォルダ削除画面」と「メイン画面」について説明していきます。

フォルダ削除画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/a2ce92dc-2cde-4452-f336-d650c02c1523.png)

メイン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/e9221b1c-c5dc-3042-9266-fa488e30f86b.png)

まず、コード全体を記載します。

```py
def sub_window3():
     
    # ウインドウの作成
    mini_window3 = tk.Toplevel(root)
    mini_window3.title("フォルダ削除画面") 
    
    # ラベルフレーム3
    frm3 = ttk.Labelframe(mini_window3,text = "フォルダ削除",
                         padding = 10)
    frm3.grid(row = 1,column = 1,padx = 20,pady = 15)
    
    ### フォルダ削除の関数 ###
    def delete_func():
        try:
            #グローバル変数の宣言
            global delete_path
            # 整理するフォルダのパス
            delete_path = filedialog.askdirectory()
            # フォルダの削除
            shutil.rmtree(delete_path)
        except:
            pass
        
    # 削除ボタン
    button7 = tk.Button(frm3,text = "削除",command = delete_func)
    button7.grid(row = 0,column = 0,padx = 20,ipadx = 30)
    
    mini_window3.mainloop()

### メインウインドウ関数 ###
def exit_func():
    # ウインドウを閉じる
    root.destroy()

##### メインウィンドウGUI #####
# メインウインドウの作成
root = tk.Tk()
root.title("ファイル起動・整理APP")

### ラベルフレーム ###
frame = ttk.Labelframe(root,text = "メインメニュー",padding = 10)
frame.grid(row = 0,column = 0,padx = 20,pady = 15)

### メニューボタン ###
# APP・ファイル起動
button1 = tk.Button(frame,text = "APP・ファイル起動",command = sub_window1)
button1.grid(row = 0,column = 0,padx = 5)

# ファイル整理
button2 = tk.Button(frame,text = "　ファイル整理　",command = sub_window2)
button2.grid(row = 0,column = 1,padx = 5)

# フォルダ削除
button3 = tk.Button(frame,text = "　フォルダ削除　",command = sub_window3)
button3.grid(row = 0,column = 2,padx = 5)

# 終了ボタン
button4 = tk.Button(frame,text = "　APP終了　",command = exit_func)
button4.grid(row = 1,column = 1,padx = 5,pady = 20,ipadx = 30)


root.mainloop()
```

それでは、最初に「フォルダ削除画面」のコードから説明していきます。

```py
def sub_window3():
     
    # ウインドウの作成
    mini_window3 = tk.Toplevel(root)
    mini_window3.title("フォルダ削除画面") 
    
    # ラベルフレーム3
    frm3 = ttk.Labelframe(mini_window3,text = "フォルダ削除",
                         padding = 10)
    frm3.grid(row = 1,column = 1,padx = 20,pady = 15)
    
    ### フォルダ削除の関数 ###
    def delete_func():
        try:
            #グローバル変数の宣言
            global delete_path
            # 整理するフォルダのパス
            delete_path = filedialog.askdirectory()
            # フォルダの削除
            shutil.rmtree(delete_path)
        except:
            pass
        
    # 削除ボタン
    button7 = tk.Button(frm3,text = "削除",command = delete_func)
    button7.grid(row = 0,column = 0,padx = 20,ipadx = 30)
    
    mini_window3.mainloop()
```
最初にウインドウを作成、画面タイトルを「フォルダ削除画面」とします。その中にラベルフレームを配置し、テキストを「フォルダ削除」とします。次に、「フォルダ削除」の関数を記述していきます。これは至ってシンプルなコードで、グローバル変数を宣言したあと、フォルダパスを指定する画面を呼び出し、指定したフォルダを削除するというコードの流れとなっております。そして、例外処理も忘れずに記述しております。最後に中央部にある「削除ボタン」こちらを押下することにより、指定したフォルダを削除する関数が動き、フォルダを削除することができます。

最後に「メインウインドウ」の解説をします。

```py
### メインウインドウ関数 ###
def exit_func():
    # ウインドウを閉じる
    root.destroy()

##### メインウィンドウGUI #####
# メインウインドウの作成
root = tk.Tk()
root.title("ファイル起動・整理APP")

### ラベルフレーム ###
frame = ttk.Labelframe(root,text = "メインメニュー",padding = 10)
frame.grid(row = 0,column = 0,padx = 20,pady = 15)

### メニューボタン ###
# APP・ファイル起動
button1 = tk.Button(frame,text = "APP・ファイル起動",command = sub_window1)
button1.grid(row = 0,column = 0,padx = 5)

# ファイル整理
button2 = tk.Button(frame,text = "　ファイル整理　",command = sub_window2)
button2.grid(row = 0,column = 1,padx = 5)

# フォルダ削除
button3 = tk.Button(frame,text = "　フォルダ削除　",command = sub_window3)
button3.grid(row = 0,column = 2,padx = 5)

# 終了ボタン
button4 = tk.Button(frame,text = "　APP終了　",command = exit_func)
button4.grid(row = 1,column = 1,padx = 5,pady = 20,ipadx = 30)


root.mainloop()
```
このコードの最初にexit_func()関数を定義しており、「APP終了ボタン」を押下するとアプリそのものを終了することができるようにしてあります。また、button1~3に前回までに説明したsub_window関数を割り当てていき、それぞれのボタン押下時に、サブウインドウが立ち上がる仕様にいたしました。

終わりに、

初めて投稿した記事ですので至らぬ点も多々ありましたが、そこは編集リクエストを受けながらどうにか書き終えることができました。以上となります。また機会があれば別の記事を投稿いたします。