python GUIでファイルダイアログを開く (tkinter.filedialog)


tkinterでファイルダイアログを使う手順のメモです

フォルダを選択する

tkinter.filedialog.askdirectoryを使えばフォルダを選択するダイアログを開いてくれます。initialdirで初期ディレクトリを指定します。

python
import tkinter.filedialog
iDir = os.path.abspath(os.path.dirname(__file__))
folder_name = tkinter.filedialog.askdirectory(initialdir=iDir)

ファイルを選択する

tkinter.filedialog.askopenfilenameでファイルダイアログを開けます。filetypesで候補ファイルのパターンを指定し、initialdirで最初に開くディレクトリを指定します。複数ファイルを選択する場合はtkinter.filedialog.askopenfilenamesです。

python
import tkinter.filedialog
fTyp = [("", "*")]
iDir = os.path.abspath(os.path.dirname(__file__))
file_name = tkinter.filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)

ファイルの拡張子を指定できます。
見出し、パターンの順で与えます。

python
fTyp = [("データファイル", "*.csv;*.xlsx;*.xls")]

ファイル名の部分一致で選択する事もできます。

python
fTyp = [("logファイル", "log*")]

使用例

実際使うときはこんな感じで使うと良いと思います。

python
import os
import tkinter as tk
import tkinter.filedialog

class TkinterClass:
    def __init__(self):
        root = tk.Tk()
        root.geometry("500x350")

        button = tk.Button(root, text='ファイルダイアログを開く', font=('', 20),
                           width=24, height=1, bg='#999999', activebackground="#aaaaaa")
        button.bind('<ButtonPress>', self.file_dialog)
        button.pack(pady=40)

        self.file_name = tk.StringVar()
        self.file_name.set('未選択です')
        label = tk.Label(textvariable=self.file_name, font=('', 12))
        label.pack(pady=0)

        button = tk.Button(root, text='フォルダダイアログを開く', font=('', 20),
                           width=24, height=1, bg='#999999', activebackground="#aaaaaa")
        button.bind('<ButtonPress>', self.folder_dialog)
        button.pack(pady=40)

        self.folder_name = tk.StringVar()
        self.folder_name.set('未選択です')
        label = tk.Label(textvariable=self.folder_name, font=('', 12))
        label.pack(pady=10)

        root.mainloop()

    def file_dialog(self, event):
        fTyp = [("", "*")]
        iDir = os.path.abspath(os.path.dirname(__file__))
        file_name = tk.filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
        if len(file_name) == 0:
            self.file_name.set('選択をキャンセルしました')
        else:
            self.file_name.set(file_name)

    def folder_dialog(self, event):
        iDir = os.path.abspath(os.path.dirname(__file__))
        folder_name = tk.filedialog.askdirectory(initialdir=iDir)
        if len(folder_name) == 0:
            self.folder_name.set('選択をキャンセルしました')
        else:
            self.folder_name.set(folder_name)


if __name__ == '__main__':
    TkinterClass()


レッツトライ

余談

上手くいくimport
import tkinter as tk
import tkinter.filedialog
tk.filedialog.askdirectory(initialdir=iDir)
上手くいかないimport
import tkinter as tk
tk.filedialog.askdirectory(initialdir=iDir)

何故!?