【Python×Tkinter】パス指定ではなくGUIでファイルを選択する方法


はじめに

普段Pythonで何かファイルを操作するとき、ディレクトリを移動したりパスを指定してファイルを読み込むことが多いと思います。しかし自分が作ったプログラムを他人(非プログラマー)が使うとなったら、人によっては自分でコードを書き換えてパスを変えるとか難しいですよね。また自分で使うにしても、読み込むファイルが毎日変わるものであればいちいちコードを書き換えるのは面倒ですよね。

そんな方のために今回はGUIからファイルを選択できるようにする方法を解説します。

準備

import tkinter
import tkinter.filedialog
import tkinter.messagebox
import os

Tkinterというライブラリを使っていきます。読み方は「ティーキンター」です。
PythonのGUI系ライブラリの中ではかなり有名で、よく使われているものだと思います。
ちなみにTkinterだけインポートしてもファイルダイアログとメッセージボックスは使えないので、この2つもtkinter単体とは別にインポートします。あとエクスプローラーを利用するため、ディレクトリ移動できるようにosもimportします。

ファイルをインポート

root = tkinter.Tk()
root.withdraw()

rootはTkinterにおけるいわゆるウィンドウを作る働きをします。最初のroot = tkinter.TK()でまさにウィンドウを生成しています。しかしその際に空の小さなウィンドウも出てきてしまいます。この小さいウィンドウは使わないので、root.withdraw()で非表示にします。

root.attributes('-topmost', True)
root.lift()
root.focus_force()

またこれは好みによりますが、ウィンドウが他のアプリやブラウザのページに隠れてしまうのが嫌という方は、root.attributes('-topmost', True)とroot.lift()を使いましょう。ウィンドウが常に最前面に来ます。またその際にroot.focus_force()も書いてあげると、ウィンドウにフォーカルが当たります。

fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('Qiita','ファイルを選択下ください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

# Show file name
tkinter.messagebox.showinfo('Qiita',file)

fTyp = [("","*")]はアスタリスクを指定することで全種類のファイルを選択できるようにしていますが、もし特定の拡張子のファイルだけ取得したいときはアスタリスクのところにtxtやxlsxなど取得したい拡張子を入れてください。

iDir = os.path.abspath(os.path.dirname(file))は、実行中のファイルのパスを取得します。そしてここで取得したパスをもとに、エクスプローラーで選択したファイルのパスが
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)で取得されます。

2つあるmessageboxは、任意のメッセージを2つ目の引数で指定できます。ちなみに1つ目の引数に入力したものはウィンドウのタイトルになるので、アプリの名前などにしておくとよいでしょう。

実行結果は下記のようになります。
ファイル選択ダイアログメッセージ

ファイル選択

選択後ダイアログ。ここでは選択したファイルのフルパスを表示

コード全体としては下記のようになります。

# Select file
root = tkinter.Tk()
root.withdraw()
root.attributes('-topmost', True)
root.lift()
root.focus_force()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
tkinter.messagebox.showinfo('Qiita','ファイルを選択下ください')
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

# Show file name
tkinter.messagebox.showinfo('Qiita',file)

参考にした記事

今回は下記の記事を参考にサンプルコードを書いてみました。
ちなみにウィンドウを最前面に持ってくるコードとメッセージボックス以外は、この記事のサンプルコードを引用させていただいております。

『Python:処理ファイルをGUIから選択する方法』https://qiita.com/666mikoto/items/1b64aa91dcd45ad91540