Python でファイル選択画面を表示する

ファイル選択画面表示の解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは Python で Tkinter を利用してファイル選択画面を表示する方法について解説します。

これにより GUI からファイルを選択できるようになります。

GUIでファイル選択する画面

GUI からファイルを選択できるようにすることで作成できるアプリの幅を大きく広げることができますので、是非使い方を理解しておきましょう!

このページで紹介するスクリプトは MacOSX で動作確認していますが、Tkinter は有名な OS であればほとんどのもので同じスクリプトで動作可能ですので、おそらく他の OS を利用している方にも参考になると思います。

動作確認環境

このページで紹介するサンプルスクリプトは下記環境で動作確認を行っています

  • OS:macOS Catalina
  • Python:3.8
  • Tkinter:8.6

tkinter.filedialog モジュール

ファイル選択画面を表示するのに使用するのは Tkinter の tkinter.filedialog です。

この tkinter.filedialog は、ファイル選択画面表示用のクラスや関数を提供するモジュールになります。

下記のように import することで使用できるようになります。

tkinter.filedialogのインポート
import tkinter.filedialog

ファイル選択画面の表示方法

ファイル選択画面は tkinter.filedialog が提供する下記の関数を実行することで表示することができます。

  • askopenfilename
    • オープンするファイルの選択画面を表示
    • 選択されたファイルのパスを返却
  • asksaveasfilename
    • 別名保存するファイルの選択画面を表示
    • 選択されたファイルのパスを返却
  • askopenfile
    • オープンするファイルの選択画面を表示
    • 選択されたファイルをオープン
    • オープンしたファイルのオブジェクトを返却
  • asksaveasfile
    • オープンするファイルの選択画面を表示
    • 選択されたファイルをオープン
    • オープンしたファイルのオブジェクトを返却

tkinter.filedialog モジュールが提供する関数には、他にも複数のファイルを選択できるファイル選択画面を表示する関数やディレクトリを選択できる関数などもありますが、ここでは解説は省略します。

askXXXfileaskXXXfilename は両方ともファイル選択画面を表示しますが、前者はファイルをオープンしてファイルオブジェクトを返却するのに対し、後者はファイルをオープンせずにファイルパスを返却する点が異なります。

スポンサーリンク

ファイル選択画面を表示するサンプルスクリプト(ファイル読み込み)

tkinter.filedialog が提供する関数を利用してファイル選択画面を表示するサンプルスクリプトを紹介します。

下記では askopenfilename を利用してファイル選択画面を表示し、選択されたファイルからの読み込みを行っています。

fileread.py
# -*- 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()

スクリプトを実行すると下のような画面が表示され、

ファイル読み込みアプリの初期画面

「ファイル読み込み」ボタンを押すとファイル選択画面が表示されます。

GUIでファイル選択する画面

ファイルを選択して「Open」ボタンを押すと、その選択したファイルの中身がラベルウィジェットに文字列として表示されます。

ファイル読み込みアプリのファイル読み込み結果

ファイル選択画面を表示するサンプルスクリプト(ファイル書き込み)

下記では asksaveasfilename を利用してファイル選択画面を表示し、選択されたファイルにデータの書き込みを行っています。

filewrite.py
# -*- 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()

スクリプトを実行すると下のような画面が表示され、

ファイル書き込みアプリの初期画面

背景がグレーのテキストボックスに文字列を記入し、

ファイル書き込みアプリに書き込む文字列を記入した様子

「ファイル書き込み」ボタンを押すとファイル選択画面が表示されます。

GUIで書き込みファイル選択する画面

ファイル名を決めて「Save」ボタンを押すと、その選択したファイルにテキストボックスの文字列が保存されます。

ファイルの保存結果

ファイル選択画面のカスタマイズ

上述した tkinter.filedialog モジュールが提供する関数には次の引数を指定し、ファイル選択画面をカスタマイズすることが可能です。

  • filetypes
    • 選択可能なファイルの拡張子
    • タプルのリストとして記述
  • title
    • ファイル選択画面のタイトル
  • initialdir
    • 選択画面で最初に表示されるフォルダ
  • initialfile
    • 選択画面で最初に表示されるファイル名
  • defaultextension
    • ファイル書き込み時のデフォルトの拡張子
  • parent
    • 親とするウィジェット
  • multiple
    • 複数のファイル選択を許可するかどうか

スポンサーリンク

カスタマイズ例1

例えば askopenfilename に下記のように引数を指定すれば、

カスタマイズ例1
def file_read():

    # ファイル選択ダイアログの表示
    file_path = tkinter.filedialog.askopenfilename(
        filetypes=[
            ("リッチテキストファイル", "*.rtf"),
            ("HTMLファイル", "*.html"),
        ],
        title="ファイル読み込み選択を変更",
        initialdir="/Applications/Python 3.8"
    )

ファイル選択画面表示事に、下の図のような画面が表示されます。

ファイル選択画面のカスタマイズ1

title の指定により選択画面のタイトルが変わり、initialdir の指定により最初に選択画面に表示されるフォルダが “/Applications/Python 3.8” になっていることが確認できると思います。

また filetypesの指定により選択可能なファイル(.rtf と .html のみ)が絞られていることがも確認できると思います。

filetypes には上記のスクリプトのように「タプルのリスト」形式で指定します。

タプルの第1要素には表示名、第2要素には「*.拡張子」という形式で指定します。

カスタマイズ例2

例えば asksaveasfilename に下記のように引数を指定すれば、

カスタマイズ例2
def file_write(data):
    
    # ファイル選択ダイアログの表示
    file_path = tkinter.filedialog.asksaveasfilename(
        initialfile="名称未設定.test",
        defaultextension="test",
    )

下の図のようなファイル選択画面が表示されます。

ファイル選択画面のカスタマイズ2

initialfile の指定により選択画面に最初に表示されるファイル名が「名称未設定.test」に変わっていることが確認できると思います。

またファイルを保存する際には、defaultextension の指定により、そのファイルの拡張子として自動的に “test” が付与されるようになっています。

こんな感じで引数を指定することでファイル選択画面を(多少は)カスタマイズすることが可能です。

まとめ

このページでは Python で GUI からファイル選択画面を表示する方法について解説しました。

ファイル選択画面を表示できるようになれば、作成できる GUI アプリの幅が広がります。またユーザーがファイル選択をしやすくなるので利便性も上がります。

そのファイル選択画面は Tkinter の filedialog モジュール利用することで簡単に表示することが可能ですので、是非覚えておいてください。

また使用する関数に引数を指定することでファイル選択画面をカスタマイズすることができますので、こちらも頭に入れておきましょう!

同じカテゴリのページ一覧を表示

4 COMMENTS

nobu

どちらも def read(write)_button_func(self):
の後で
inconsistent use of tabs and spaces in indentaion
なるエラーが出てしまって動きません

def以降の関数をコメントアウトすれば動くのですがボタンが表示されないので
ダイアログが開きません
参考にしてるコードが動かないのでは素人はお手上げです

daeu

nobu さん

コメントありがとうございます。

私も再度このページのスクリプトを実行してみましたが、うまく動いてしまいました…。

そのエラーは、スクリプト内のインデントに “タブ” と “スペース” が混在しているというエラーになります。

このページで公開しているスクリプトは “タブ” ではなく “スペース” を使用しています。

今一度 “タブ” と “スペース” が混在していないかどうかをご確認いただけないでしょうか。
どちらか一方に統一すれば、少なくともそのエラーは解消されると思います。

フー

読み込むファイルの名前を取りたいですが、なんか良い方法が有りませんか?

daeu

フーさん

コメントありがとうございます!

質問としては「選択されたファイルのファイル名のみを取得したい」ということでよろしいでしょうか?

もしそうであれば os.path モジュールを使うのが良いと思います。

下記で file_path にファイルパス(フォルダ名とファイル名)が格納されますので、

    # ファイル選択ダイアログの表示
    file_path = tkinter.filedialog.asksaveasfilename()

その後に、下記のように osimport した後に basename 関数を実行すれば file_name にファイル名のみが格納されます(逆にフォルダ名を取得するときは dirname 関数を実行する)。

    import os

    file_name = os.path.basename(file_path) # ファイル名のみ取得
    dir_name = os.path.dirname(file_path) # フォルダ名のみ取得

    print(file_name) # ファイル名のみ表示される
    print(dir_name) # フォルダ名のみ表示される

import os はもちろんスクリプトの最初に記述しても良いです。

もし回答が十分でないようであれば、またコメントしていただければと思います。
よろしくお願いいたします。

現在コメントは受け付けておりません。