Pythonで処理ファイルをGUI(ファイルダイアログ)で選択する(tkinter)

pythonでファイル入出力を伴う処理を記述する際、ファイルをGUI(ファイルダイアログ)から選択できると便利です。自分でもちょいちょい使うので、クラスファイルを作っておきました。

コード

import os, tkinter, tkinter.filedialog

class FileDialog:
    def __init__(self):
        self.root = tkinter.Tk()
        self.root.withdraw()
        
        # set options for tkinter.filedialog
        self.options = {}
    
    # choose one file(ext is optional)
    def choose_file(self, dir, *ext):
        self.options['initialdir'] = os.path.abspath(dir)
        if ext:
            self.options['filetypes'] = [('', ext), ('all files','.*')]
        else:
            self.options['filetypes'] = [('all files','.*')]
        return tkinter.filedialog.askopenfilename(**self.options)

    # choose multipule files(ext is optional)
    def choose_files(self, dir, *ext):
        self.options['initialdir'] = os.path.abspath(dir)
        if ext:
            self.options['filetypes'] = [('', ext), ('all files','.*')]
        else:
            self.options['filetypes'] = [('all files','.*')]
        file = tkinter.filedialog.askopenfilenames(**self.options)
        return list(file)

    # choose directory
    def choose_dir(self, dir):
        self.options['initialdir'] = os.path.abspath(dir)
        return tkinter.filedialog.askdirectory(**self.options)

    # choose save directory(filename is optional)
    def choose_save_path(self, dir, *filename):
        self.options['initialdir'] = os.path.abspath(dir)
        if filename:
            self.options['initialfile'] = filename
        else:
            self.options['initialfile'] = 'newfile'
        self.options['defaultextension'] = '.*'
        self.options['filetypes'] = [('all files','.*')]
        return tkinter.filedialog.asksaveasfilename(**self.options) 

関数一覧

choose_file(self, dir, *ext)

変数dirで指定されたディレクトリを開き、そこからファイルを1つ選択できます。変数extは表示するファイルの拡張子を指定できますが、省略可能です。選択されたファイルの絶対パスを返します。

choose_files(self, dir, *ext)

choose_file()は1つのファイルのみ選択できるのに対し、こちらは複数のファイルを同時に選択できます。選択されたファイルの絶対パスをリストにまとめて返します。

choose_dir(self, dir)

変数dirで指定されたディレクトリを開き、そこからディレクトリを1つ選択できます。 選択されたディレクトリの絶対パスを返します。

choose_save_path(self, dir, *filename)

変数dirで指定されたディレクトリを開き、そこから保存先と保存ファイル名を指定できます。 変数filenameはデフォルトのファイル名を指定できますが、省略可能です。指定されたファイルの絶対パスを返します。

いずれの関数もファイルを開くわけではなく、あくまでもファイルダイアログで選択したファイルやディレクトリの完全パスを返すだけです。関数名がイマイチなのでもっといいものに変えたいです。

使い方

fd = FileDialog()

# choose_file test
file_name = fd.choose_file('./')
if file_name:
    with open(file_name) as f:
        text = f.read()
        print(text)

# choose_save_path test
save_file = fd.choose_save_path('./', 'newfile.txt')
if save_file:
    with open(save_file, 'w') as f:
        f.write('hoge')

関数を呼び出すと、以下のようにファイルダイアログが開きます。

簡単な説明

複雑なコードではないので細かい説明は不要だと思います。tkinterを使ってファイルダイアログを呼び出しているだけです。ダイアログを呼び出す前に、optionという辞書型変数で以下の初期設定を行っています。

  • defaultextension: 拡張子が指定されなかった時のデフォルト拡張子
  • filetypes: ファイルの種類(“all files (*.*)”など)
  • initialdir: ダイアログが開いた時に表示されるディレクトリ

他にも設定項目はありますが、今回は上の3つを設定しています。

参考

Python:処理ファイルをGUIから選択する方法 – Qiita https://qiita.com/chanmaru/items/1b64aa91dcd45ad91540

tkinter.filedialog.asksaveasfilename Python Example https://www.programcreek.com/python/example/95891/tkinter.filedialog.asksaveasfilename

コメント

タイトルとURLをコピーしました