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

前回のPART2では「フォルダ・ファイル選択画面」について解説しました。今回は「ファイル整理画面」について解説していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631873/d2c40e57-4f45-3759-412c-4a190221026d.png)

ファイル整理画面の目的は、整理したいファイル（別フォルダに移動させたい時など）を任意のフォルダに移動させる画面です。それではコードを見ていきましょう。

```py
def sub_window2():
    
    # ウインドウの作成
    mini_window2 = tk.Toplevel(root)
    mini_window2.title("ファイル整理画面") 
    
    # ラベルフレーム2
    frm2 = ttk.Labelframe(mini_window2,text = "ファイル整理",
                         padding = 10)
    frm2.grid(row = 0,column = 0,padx = 20,pady = 15)
    
    ### ファイル移動の関数 ###
    # 参照
    def browse_func():
        #グローバル変数の宣言
        global dir_path
        # 整理するフォルダのパス
        dir_path = filedialog.askdirectory()
    # 移動
    def run_func():
        try:
            # 移動先フォルダのパス
            save_path = filedialog.askdirectory()
            # 拡張子の判別とファイル移動
            for file in os.listdir(dir_path):
                if file.endswith(cb.get()):
                    path = dir_path + "/" + file
                    shutil.move(path,save_path)
        except:
            pass
    
    # コンボボックス
    extensions = [".docx",".xlsx",".xlsm",".txt",".py",".jpg"]
    cb = ttk.Combobox(frm2,values = extensions,state = "readonly")
    cb.pack(side = tk.LEFT)
    cb.current(0)
    
    # 移動ボタン
    button6 = tk.Button(mini_window2,text = "移動",
                       command = run_func)
    button6.grid(row = 2,column = 0,padx = 20,pady = 20,ipadx = 30)
    
    # 参照ボタン
    button7 = tk.Button(mini_window2,text = "参照",
                       command = browse_func)
    button7.grid(row = 1,column = 0,padx = 20,ipadx = 30)
    
    mini_window2.mainloop()
```
まずは定義した関数sub_window2()の解説をしていきます。
```py
def sub_window2():
    
    # ウインドウの作成
    mini_window2 = tk.Toplevel(root)
    mini_window2.title("ファイル整理画面") 
    
    # ラベルフレーム2
    frm2 = ttk.Labelframe(mini_window2,text = "ファイル整理",
                         padding = 10)
    frm2.grid(row = 0,column = 0,padx = 20,pady = 15)
```
最初にウインドウ2（ファイル整理画面のウインドウ）を作成し、タイトルを「ファイル整理画面」とします。そしてラベルフレームを入れ、テキストを「ファイル整理」とし、位置を決めていきます。

ファイル移動の関数
```py
 ### ファイル移動の関数 ###
    # 参照
    def browse_func():
        #グローバル変数の宣言
        global dir_path
        # 整理するフォルダのパス
        dir_path = filedialog.askdirectory()
    # 移動
    def run_func():
        try:
            # 移動先フォルダのパス
            save_path = filedialog.askdirectory()
            # 拡張子の判別とファイル移動
            for file in os.listdir(dir_path):
                if file.endswith(cb.get()):
                    path = dir_path + "/" + file
                    shutil.move(path,save_path)
        except:
            pass
```
最初に整理したいフォルダを参照する関数browse_func()の解説をします。といってもグローバル変数を宣言し、整理したいフォルダを選択するウインドウを呼び出せるコードを入れただけのシンプルな作りです。

次にファイルを移動させるrun_func()関数の定義ですが、例外が起きてもいいように例外処理をし、(try~except)その中に移動先のフォルダを指定するコードを記述し、拡張子の判別とファイルの移動を行う繰り返し処理を記述しております。

GUI
```py
  # コンボボックス
    extensions = [".docx",".xlsx",".xlsm",".txt",".py",".jpg"]
    cb = ttk.Combobox(frm2,values = extensions,state = "readonly")
    cb.pack(side = tk.LEFT)
    cb.current(0)
    
    # 移動ボタン
    button6 = tk.Button(mini_window2,text = "移動",
                       command = run_func)
    button6.grid(row = 2,column = 0,padx = 20,pady = 20,ipadx = 30)
    
    # 参照ボタン
    button7 = tk.Button(mini_window2,text = "参照",
                       command = browse_func)
    button7.grid(row = 1,column = 0,padx = 20,ipadx = 30)
    
    mini_window2.mainloop()
```
最後にGUIの説明をします。最初にコンボボックスの中身として、ファイルの拡張子を選択できるようにそれぞれ拡張子を記述しております。次に移動ボタンですが、ここでrun_func()関数が動きファイルを任意のフォルダに移動させます。また、参照ボタンはbrowse_func()が動き、移動したいファイルが格納されているフォルダを選択することができます。（画面から見れば順不同で申し訳ありません。）

今回はここまでとします。次回は「フォルダ削除画面」の解説をしていきます。