ファイル選択機能を実装してみました
GUIでよく見かける「ファイル選択」機能をPythonのtkinterで実装しました。
完成イメージはこんなかんじです。
機能の概要は、
- 「FILE」ボタンを押すとファイル選択画面がポップアップ
- 選択したファイルのパスをテキストボックスに表示
- 「SHOW」ボタンを押すとファイルの中身を表示
という感じ。
tkinterを知らない方はまず下記の記事から見ていただくと、より理解が深まるかもしれません。
- 【Python】GUIアプリを作ってみる【Tkinter編】※初心者向け
tkinterの初心者用の記事。「Hello World」をtkinterを使って表示するところから。 - 【Python】tkinterのWidgetの配置方法【サンプルプログラムで解説】
tkinterでボタンなどのウィジェットの表示方法のまとめ。
【Python】tkinterでファイル選択機能の実装
開発環境
- OS Windows 10
- Pythonバージョン 3.7.1
- 使用ライブラリ tkinter
tkinterはPythonの標準でついているライブラリです。そのため、追加でライブラリのインストールは不要です。
サンプルプログラム
ソースコード
こちらがソースコードです。コピペで実行で動くはずです。
import tkinter as tk from tkinter import ttk from tkinter import filedialog # [FILE]ボタン押下時に呼び出し。選択したファイルのパスをテキストボックスに設定する。 def open_file_command(edit_box, file_type_list): file_path = filedialog.askopenfilename(filetypes = file_type_list) edit_box.delete(0, tk.END) edit_box.insert(tk.END, file_path) # ファイル設定エリアのフレームを作成して返却する関数 def set_file_frame(parent_frame, label_text, file_type_list): file_frame = ttk.Frame(parent_frame) tk.Label(file_frame, text = label_text).pack(side = tk.LEFT) # テキストボックスの作成と配置 file_frame.edit_box = tk.Entry(file_frame, width = 50) file_frame.edit_box.pack(side = tk.LEFT) # ボタンの作成と配置 file_button = tk.Button(file_frame, text = 'FILE', width = 5\ , command = lambda:open_file_command(file_frame.edit_box, file_type_list)) file_button.pack(side = tk.LEFT) return file_frame # [SHOW]ボタン押下時に呼び出し。ファイルの中身をラベルフレームに表示する。 def show_file_command(show_frame, filename_str): file_object = open(filename_str) file_result = file_object.read() show_frame.show_area["text"] = file_result # ファイル表示エリアのフレームを作成して返却する関数 def show_file_frame(parent_frame, textfile_set_frame): show_frame = ttk.Frame(parent_frame) # ボタンの作成と配置 show_button = tk.Button(show_frame, text = 'SHOW', width = 10\ , command = lambda:show_file_command(show_frame, textfile_set_frame.edit_box.get())) show_button.pack() # ファイル表示用のラベルの作成と配置(空文字で初期化) show_frame.text_str = tk.StringVar() show_frame.text_str.set(textfile_set_frame.edit_box.get()) show_frame.show_area = tk.Label(show_frame, text = "", width = 60, height = 10, relief = "raised") show_frame.show_area.pack() return show_frame # フレームを作成する関数を呼び出して配置 def set_main_frame(root_frame): # ファイル選択エリア作成(ファイルの拡張子を指定) file_set_frame = set_file_frame(root_frame, "ファイル"\ , [('TEXTファイル', '*.txt'), ('PNGファイル', '*.png')]) file_set_frame.pack() file_show_frame = show_file_frame(root_frame, file_set_frame) file_show_frame.pack() # メイン関数 if __name__ == '__main__': root = tk.Tk() root.title('Tkinter training') root.geometry("500x300") set_main_frame(root) root.mainloop()
実行結果
- 初期画面
- ファイル選択画面
初期画面で「FILE」ボタンを押下すると次の画面がポップアップで表示されます。
ファイルを選択し「開く」ボタンを押下するとファイルパスを取得して画面が閉じます。
このテキストファイルの中身は次のようになっています。
- ファイル選択後の画面
選択したファイルの絶対パスがテキストボックスに表示されます。
- ファイルの中身を表示
ファイルを選択した後で「SHOW」ボタンを押下すると、次のようにファイルの中身が表示されます。
プログラム解説1 ソースコードを読む順序
初心者の方は、下記の順番でプログラムを見ていただくと良いかと思います。
- メイン関数(54~59行目)
if __name__ == '__main__':
で始まる54行目からがメイン関数になります。 - 「set_main_frame」関数(45~51行目)
GUIのフレームを作成する関数を呼び出しています。
今回のプログラムでは、「ファイル入力のフレーム(file_set_frame )」と「ファイル表示のフレーム(file_show_frame )」の2つを作成しています。 - 「set_file_frame」関数・「open_file_command」関数
「set_file_frame」関数では、FILEボタンなどの配置しています。
FILEボタンを押したときに「open_file_command」関数を呼び出しています。
「open_file_command」関数で呼ばれている「filedialog.askopenfilename」がファイル選択画面を表示する関数です。
※公式のドキュメントはこちら(Tkinter Dialogs) - 「show_file_frame」関数・「show_file_command」関数
「show_file_frame」関数では、SHOWボタンなどの配置をしています。
SHOWボタンを押したときに「show_file_command」関数を呼び出しています。
プログラム解説2 使用しているウィジェットと配置方法
tkinterで使用したウィジェットは主に下記の3つです。
- Label ラベル
“ファイル”と書いてある箇所とファイルの中身を表示する箇所で使用しています。 - Button ボタン
FILEボタンとSHOWボタンで使用しています。
FILEボタンを押したときの動作は「open_file_command」関数で定義しています。
SHOWボタンを押したときの動作は「show_file_command」関数で定義しています。 - Entry テキストボックス
選択したファイルのパスを表示するエリアで使用しています。
ウィジェットの配置には「Pack」を使用しています。
まとめ
最後まで読んでいただきありがとうございました。
今回は、Pythonのライブラリ「tkinter」を使用して「ファイル選択」機能を実装しました。
tkinterの「filedialog.askopenfilename」を使用することで簡単にファイル選択画面を呼び出すことができました。
「ファイルを選択して画像を表示する」「matplotで描画するファイルを選択する」など、Tkinterを使った様々なプログラムに応用できると思います。ぜひ活用ください。