このページでは Python で Tkinter を利用してファイル選択画面を表示する方法について解説します。
これにより GUI からファイルを選択できるようになります。
GUI からファイルを選択できるようにすることで作成できるアプリの幅を大きく広げることができますので、是非使い方を理解しておきましょう!
このページで紹介するスクリプトは MacOSX で動作確認していますが、Tkinter は有名な OS であればほとんどのもので同じスクリプトで動作可能ですので、おそらく他の OS を利用している方にも参考になると思います。
このページで紹介するサンプルスクリプトは下記環境で動作確認を行っています
- OS:macOS Catalina
- Python:3.8
- Tkinter:8.6
Contents
tkinter.filedialog
モジュール
ファイル選択画面を表示するのに使用するのは Tkinter の tkinter.filedialog
です。
この tkinter.filedialog
は、ファイル選択画面表示用のクラスや関数を提供するモジュールになります。
下記のように import
することで使用できるようになります。
import tkinter.filedialog
ファイル選択画面の表示方法
ファイル選択画面は tkinter.filedialog
が提供する下記の関数を実行することで表示することができます。
askopenfilename
:- オープンするファイルの選択画面を表示
- 選択されたファイルのパスを返却
asksaveasfilename
:- 別名保存するファイルの選択画面を表示
- 選択されたファイルのパスを返却
askopenfile
:- オープンするファイルの選択画面を表示
- 選択されたファイルをオープン
- オープンしたファイルのオブジェクトを返却
asksaveasfile
:- オープンするファイルの選択画面を表示
- 選択されたファイルをオープン
- オープンしたファイルのオブジェクトを返却
tkinter.filedialog
モジュールが提供する関数には、他にも複数のファイルを選択できるファイル選択画面を表示する関数やディレクトリを選択できる関数などもありますが、ここでは解説は省略します。
askXXXfile
と askXXXfilename
は両方ともファイル選択画面を表示しますが、前者はファイルをオープンしてファイルオブジェクトを返却するのに対し、後者はファイルをオープンせずにファイルパスを返却する点が異なります。
スポンサーリンク
ファイル選択画面を表示するサンプルスクリプト(ファイル読み込み)
tkinter.filedialog
が提供する関数を利用してファイル選択画面を表示するサンプルスクリプトを紹介します。
下記では askopenfilename
を利用してファイル選択画面を表示し、選択されたファイルからの読み込みを行っています。
# -*- coding:utf-8 -*-
import tkinter
import tkinter.filedialog
def file_read():
# ファイル選択ダイアログの表示
file_path = tkinter.filedialog.askopenfilename()
if len(file_path) != 0:
# ファイルが選択された場合
# ファイルを開いて読み込んでdataに格納
f = open(file_path)
data = f.read()
f.close()
else:
# ファイル選択がキャンセルされた場合
# dataは空にする
data = ''
return data
class Application(tkinter.Tk):
def __init__(self):
super().__init__()
# アプリのタイトル
self.title("ファイル読み込み")
# テキスト表示キャンバスの作成と配置
self.text_canvas = tkinter.Canvas(
self,
width=600,
height=400,
bg="#D0D0D0"
)
self.text_canvas.pack()
# 読み込みボタンの作成と配置
self.read_button = tkinter.Button(
self,
text='ファイル読み込み',
command=self.read_button_func
)
self.read_button.pack()
def read_button_func(self):
'読み込みボタンが押された時の処理'
# ファイルを読み込み
data = file_read()
# 読み込んだ結果を画面に描画
self.text_canvas.create_text(300, 200, text=data)
# GUIアプリ生成
app = Application()
app.mainloop()
スクリプトを実行すると下のような画面が表示され、
「ファイル読み込み」ボタンを押すとファイル選択画面が表示されます。
ファイルを選択して「Open」ボタンを押すと、その選択したファイルの中身がラベルウィジェットに文字列として表示されます。
ファイル選択画面を表示するサンプルスクリプト(ファイル書き込み)
下記では asksaveasfilename
を利用してファイル選択画面を表示し、選択されたファイルにデータの書き込みを行っています。
# -*- coding:utf-8 -*-
import tkinter
import tkinter.filedialog
def file_write(data):
# ファイル選択ダイアログの表示
file_path = tkinter.filedialog.asksaveasfilename()
if len(file_path) != 0:
# ファイルが選択された場合
# ファイルを開いてdataを書き込み
f = open(file_path, "w")
f.write(data)
f.close()
class Application(tkinter.Tk):
def __init__(self):
super().__init__()
# アプリのタイトル
self.title("ファイルの書き込み")
# テキストボックスの作成
self.text_box = tkinter.Text(
self,
bg="#D0D0D0"
)
self.text_box.pack()
self.write_button = tkinter.Button(
self,
text='ファイル書き込み',
command=self.write_button_func
)
self.write_button.pack()
def write_button_func(self):
'書き込みボタンが押された時の処理'
# テキストボックスから文字列取得
data = app.text_box.get('1.0', 'end -1c')
# ファイルを読み込み
file_write(data)
# GUIアプリ生成
app = Application()
app.mainloop()
スクリプトを実行すると下のような画面が表示され、
背景がグレーのテキストボックスに文字列を記入し、
「ファイル書き込み」ボタンを押すとファイル選択画面が表示されます。
ファイル名を決めて「Save」ボタンを押すと、その選択したファイルにテキストボックスの文字列が保存されます。
ファイル選択画面のカスタマイズ
上述した tkinter.filedialog
モジュールが提供する関数には次の引数を指定し、ファイル選択画面をカスタマイズすることが可能です。
filetypes
:- 選択可能なファイルの拡張子
- タプルのリストとして記述
title
:- ファイル選択画面のタイトル
initialdir
:- 選択画面で最初に表示されるフォルダ
initialfile
:- 選択画面で最初に表示されるファイル名
defaultextension
:- ファイル書き込み時のデフォルトの拡張子
parent
:- 親とするウィジェット
multiple
:- 複数のファイル選択を許可するかどうか
スポンサーリンク
カスタマイズ例1
例えば askopenfilename
に下記のように引数を指定すれば、
def file_read():
# ファイル選択ダイアログの表示
file_path = tkinter.filedialog.askopenfilename(
filetypes=[
("リッチテキストファイル", "*.rtf"),
("HTMLファイル", "*.html"),
],
title="ファイル読み込み選択を変更",
initialdir="/Applications/Python 3.8"
)
ファイル選択画面表示事に、下の図のような画面が表示されます。
title
の指定により選択画面のタイトルが変わり、initialdir
の指定により最初に選択画面に表示されるフォルダが “/Applications/Python 3.8” になっていることが確認できると思います。
また filetypes
の指定により選択可能なファイル(.rtf と .html のみ)が絞られていることがも確認できると思います。
filetypes
には上記のスクリプトのように「タプルのリスト」形式で指定します。
タプルの第1要素には表示名、第2要素には「*.拡張子
」という形式で指定します。
カスタマイズ例2
例えば asksaveasfilename
に下記のように引数を指定すれば、
def file_write(data):
# ファイル選択ダイアログの表示
file_path = tkinter.filedialog.asksaveasfilename(
initialfile="名称未設定.test",
defaultextension="test",
)
下の図のようなファイル選択画面が表示されます。
initialfile
の指定により選択画面に最初に表示されるファイル名が「名称未設定.test」に変わっていることが確認できると思います。
またファイルを保存する際には、defaultextension
の指定により、そのファイルの拡張子として自動的に “test” が付与されるようになっています。
こんな感じで引数を指定することでファイル選択画面を(多少は)カスタマイズすることが可能です。
まとめ
このページでは Python で GUI からファイル選択画面を表示する方法について解説しました。
ファイル選択画面を表示できるようになれば、作成できる GUI アプリの幅が広がります。またユーザーがファイル選択をしやすくなるので利便性も上がります。
そのファイル選択画面は Tkinter の filedialog モジュール利用することで簡単に表示することが可能ですので、是非覚えておいてください。
また使用する関数に引数を指定することでファイル選択画面をカスタマイズすることができますので、こちらも頭に入れておきましょう!
どちらも def read(write)_button_func(self):
の後で
inconsistent use of tabs and spaces in indentaion
なるエラーが出てしまって動きません
def以降の関数をコメントアウトすれば動くのですがボタンが表示されないので
ダイアログが開きません
参考にしてるコードが動かないのでは素人はお手上げです
nobu さん
コメントありがとうございます。
私も再度このページのスクリプトを実行してみましたが、うまく動いてしまいました…。
そのエラーは、スクリプト内のインデントに “タブ” と “スペース” が混在しているというエラーになります。
このページで公開しているスクリプトは “タブ” ではなく “スペース” を使用しています。
今一度 “タブ” と “スペース” が混在していないかどうかをご確認いただけないでしょうか。
どちらか一方に統一すれば、少なくともそのエラーは解消されると思います。
読み込むファイルの名前を取りたいですが、なんか良い方法が有りませんか?
フーさん
コメントありがとうございます!
質問としては「選択されたファイルのファイル名のみを取得したい」ということでよろしいでしょうか?
もしそうであれば
os.path
モジュールを使うのが良いと思います。下記で
file_path
にファイルパス(フォルダ名とファイル名)が格納されますので、その後に、下記のように
os
をimport
した後にbasename
関数を実行すればfile_name
にファイル名のみが格納されます(逆にフォルダ名を取得するときはdirname
関数を実行する)。import os
はもちろんスクリプトの最初に記述しても良いです。もし回答が十分でないようであれば、またコメントしていただければと思います。
よろしくお願いいたします。