Python3 - Tkinter ファイルを開くためのダイアログを表示する (tkinter.filedialog)

目次

ファイルを開くためのダイアログを表示する

ファイルを開くためのダイアログを表示するには、 tkinter.filedialog モジュールの askopenfilename 関数を使います。

戻り値については、 ファイルダイアログでファイルを選択して、 「開くボタン (Open)」をクリックした場合、 選択してあるファイルのパスが文字列で返ってきます。 また、「キャンセルボタン (Cancal)」や「閉じるボタン (X)」をクリックした場合、 判定で偽 (False) となる値が返ってきます。

Example

source code

from tkinter import StringVar
from tkinter import Tk
from tkinter import filedialog
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.configure(padding=(6, 4))
        self.pack(expand=1, fill="x", anchor="n")
        self.make_style()
        self.create_widgets()

    def make_style(self):
        pass

    def create_widgets(self):
        self.label1 = ttk.Label(self, text="File:")
        self.label1.pack(side="left", padx=(0, 2))

        self.entry1_var = StringVar()
        self.entry1 = ttk.Entry(self, textvariable=self.entry1_var,
                                      width=32)
        self.entry1.state(["readonly"])
        self.entry1.pack(side="left", expand=1, fill="x", padx=(0, 6))

        self.button1 = ttk.Button(self, text="OPEN",
                                        command=self.show_open_dialog)
        self.button1.pack(side="left")

    def show_open_dialog(self):
        fname = filedialog.askopenfilename()
        if fname:
            self.entry1_var.set(fname)
        else:
            print("Cancel or X button was clicked.")

root = Tk()
root.title("Tkinter win")
frame = MainFrame(root)
frame.mainloop()

result

表示内容 (メインウィンドウ):

実行結果

表示内容 (メインウィンドウで OPEN ボタンをクリックして表示したファイルダイアログ):

実行結果

filetypes オプション

askopenfilename 関数を使う時に filetypes オプションを指定すると、 ファイルダイアログで File of types が有効になります。 File of type で表示したい拡張子を選択すると、 選んだ拡張子を持つファイルだけが表示されます。

指定する値の型は、(label, pattern) のようなタプルのリストです。 例えば、PNG ファイルのみ表示したい場合は、 ("PNG Image Files", ".png") を指定するリストに追加します。 また、すべてのファイルを表示したい場合は、 ("All Files", ".*") をリストに追加します。

Example

source code

from tkinter import StringVar
from tkinter import Tk
from tkinter import filedialog
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.configure(padding=(6, 4))
        self.pack(expand=1, fill="x", anchor="n")
        self.make_style()
        self.create_widgets()

    def make_style(self):
        pass

    def create_widgets(self):
        self.label1 = ttk.Label(self, text="File:")
        self.label1.pack(side="left", padx=(0, 2))

        self.entry1_var = StringVar()
        self.entry1 = ttk.Entry(self, textvariable=self.entry1_var,
                                      width=32)
        self.entry1.state(["readonly"])
        self.entry1.pack(side="left", expand=1, fill="x", padx=(0, 6))

        self.button1 = ttk.Button(self, text="OPEN",
                                        command=self.show_open_dialog)
        self.button1.pack(side="left")

    def show_open_dialog(self):
        ftypes = [("PNG Image Files", ".png"),
                  ("SVG Image Files", ".svg .xml"),
                  ("All Files", ".*")]
        fname = filedialog.askopenfilename(filetypes=ftypes)
        if fname:
            self.entry1_var.set(fname)
        else:
            print("Cancel or X button was clicked.")

root = Tk()
root.title("Tkinter win")
frame = MainFrame(root)
frame.mainloop()

result

表示内容 (ファイルダイアログで、All Files を選択した時):

実行結果

表示内容 (ファイルダイアログで、PNG Image Files を選択かつ任意のファイルを選択した時):

実行結果

表示内容 (ファイルダイアログで、SVG Image Files を選択かつ任意のファイルを選択した時):

実行結果

スタイル設定時の注意

Tkinter のバージョン 8.6 時点では、 特定のウィジェットに一括してスタイルを設定している場合、 ファイルダイアログにも影響が有ります。

よって、スタイルを一括して設定する時は、 ファイルダイアログの見栄えが悪くならないように気をつける必要が有るかもしれません。

次の Example はラベル、テキストボックス、ボタンのスタイルを設定した時の例です。

Example

source code

from tkinter import StringVar
from tkinter import Tk
from tkinter import filedialog
from tkinter import ttk

class MainFrame(ttk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.configure(padding=(6, 4))
        self.pack(expand=1, fill="x", anchor="n")
        self.make_style()
        self.create_widgets()

    def make_style(self):
        s = ttk.Style()
        s.configure("TLabel", background="#ffff00")
        s.configure("TEntry", foreground="#ff0000")
        s.configure("TButton", font=("", 16))

    def create_widgets(self):
        self.label1 = ttk.Label(self, text="File:")
        self.label1.pack(side="left", padx=(0, 2))

        self.entry1_var = StringVar()
        self.entry1 = ttk.Entry(self, textvariable=self.entry1_var,
                                      width=32)
        self.entry1.state(["readonly"])
        self.entry1.pack(side="left", expand=1, fill="x", padx=(0, 6))

        self.button1 = ttk.Button(self, text="OPEN",
                                        command=self.show_open_dialog)
        self.button1.pack(side="left")

    def show_open_dialog(self):
        fname = filedialog.askopenfilename()
        if fname:
            self.entry1_var.set(fname)
        else:
            print("Cancel or X button was clicked.")

root = Tk()
root.title("Tkinter win")
frame = MainFrame(root)
frame.mainloop()

result

表示内容 (ファイルダイアログで、ファイルを選択した時):

実行結果

表示内容 (ファイルを選択した後のメインウィンドウ):

実行結果

参考リンク