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

目次

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

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

戻り値については、 ファイルダイアログでファイルを選択して、 「保存ボタン (Save)」をクリックした場合、 指定したファイルのパスが文字列で返ってきます。 また、「キャンセルボタン (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="SAVE",
                                        command=self.show_save_dialog)
        self.button1.pack(side="left")

    def show_save_dialog(self):
        fname = filedialog.asksaveasfilename()
        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

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

実行結果

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

実行結果

表示内容 (ファイルダイアログで既存のファイル名を入力した場合の警告):

実行結果

filetypes オプション

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

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

また、ファイルタイプ (File of type) の pattern で ".*" 以外を選択、 かつファイル名 (File name) に拡張子を入力していない場合、 返ってくるファイル名の末尾に pattern の拡張子が追加されます。
例えば、ファイル名に "image" と入力し、ファイルタイプの pattern が ".png" の場合、 "/dir1/dir2/image.png" といったパスが返ってきます。

initialfile オプション

asksaveasfilename 関数を使う時に initialfile オプションを指定すると、 ファイル名の初期文字列を設定できます。

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="SAVE",
                                        command=self.show_save_dialog)
        self.button1.pack(side="left")

    def show_save_dialog(self):
        ftypes = [("PNG Image Files", ".png"),
                  ("SVG Image Files", ".svg .xml"),
                  ("All Files", ".*")]
        ini_fname = "example"
        fname = filedialog.asksaveasfilename(filetypes=ftypes,
                                             initialfile=ini_fname)
        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

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

実行結果

表示内容 (ファイル名 "example" と入力した後のメインウィンドウ):

実行結果

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

実行結果

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

実行結果

参考リンク