Pythonでディレクトリを選択するダイアログを使う

Pythonでディレクトリを選択するダイアログを表示して使ってみます。

ディレクトリを選択する

いわゆるコモンダイアログでディレクトリを選択します。

Pythonのtkinterを使います。

import tkinter.filedialog

ret = tkinter.filedialog.askdirectory([initialdir], [title], [mustexist])
変数 内容
initialdir str 省略可。ダイアログを開いた時点の初期ディレクトリ。
title str 省略可。ダイアログのタイトル。
mustexist bool 省略可。既定値はTrue。存在するディレクトリだけを選択できるようにするか。
ret str ディレクトリの絶対パス。

mustexistで存在しないディレクトリを選択できるかどうかを指定します。mustexistがTrueの場合は、既存のディレクトリだけを選択できます。mustexistがFalseの場合は、入力欄に新しいディレクトリ名を入れて選択することが出来ます。

試してみましょう。

ボタンを押すとディレクトリを選択するダイアログを表示して、ダイアログを閉じると戻り値の型と内容をラベルに表示するアプリです。

import tkinter
import tkinter.filedialog

class Application(tkinter.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.master.title('tkinter dialog trial')
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.dialog_button = tkinter.Button(self, text='Choose Directory...', command=file_open, width=120)
        self.dialog_button.pack(anchor=tkinter.NW)

        self.text_1 = tkinter.StringVar()
        self.type_label = tkinter.Label(self, textvariable=self.text_1)
        self.type_label.pack(anchor=tkinter.W)
        self.text_2 = tkinter.StringVar()
        self.content_label = tkinter.Label(self, textvariable=self.text_2)
        self.content_label.pack(anchor=tkinter.W)

def file_open():
    ini_dir = 'C:\\Program Files\\Python37'
    ret = tkinter.filedialog.askdirectory(initialdir=ini_dir, title='file dialog test', mustexist = True)
    app.text_1.set('Type : ' + str(type(ret)))
    app.text_2.set('Content : ' + str(ret))

root = tkinter.Tk()
app = Application(master=root)
app.mainloop()

まずはmustexistがTrueの場合です。

ダイアログでtoolsディレクトリを選択します。

ダイアログ1 結果1

ディレクトリのパスが文字列として戻されました。

ではここで、存在しないディレクトリを選択してみます。

ダイアログ2 ダイアログ3

ディレクトリが存在しないと怒られてしまいました。ダイアログに戻ります。

では、mustexistをFalseにしてみます。

def file_open():
    ini_dir = 'C:\\Program Files\\Python37'
    ret = tkinter.filedialog.askdirectory(initialdir=ini_dir, title='file dialog test', mustexist=False)
    app.text_1.set('Type : ' + str(type(ret)))
    app.text_2.set('Content : ' + str(ret))

これで存在しないディレクトリが選択できるはず・・・なのですが、なぜか私の環境(Windows10、Python 3.7)ではうまくうごきませんでした。

まあダイアログ内で右クリックメニューが使えますので、ディレクトリを作ってから選択すれば良いのかもしれませんが。

ちなみに、ダイアログをキャンセルすると、空の文字列が戻されます。

広告

PythonでGUIカテゴリの投稿