芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

wxPythonによるファイル・フォルダ選択ダイアログ

フォルダダイアログ:フォルダの選択

def folda_choice(text):
    # wx.FD_OPEN:ダイアログを「開く」モードで起動する
    app=wx.App()
    # フォルダ選択ダイアログを作成
    dialog = wx.DirDialog(None, u'{}フォルダを選択してください'.format(text), style=wx.FD_OPEN )
    # フォルダが選択されたとき
    if dialog.ShowModal() == wx.ID_OK:
        # 選択したファイルパスを取得する
        folda_path=dialog.GetPath()
        dialog.Destroy()
        return folda_path
    elif dialog.ShowModal() == wx.ID_CANCEL:
        sys.exit()

ファイルダイアログ

ファイルを1つ選択

def file_choice(text):
    # ファイル選択ダイアログを作成
    app=wx.App()
    # 選択可能なファイルを制限する
    filters = " txt files (*.txt)|*.txt"
    # ファイル選択ダイアログを作成
    dialog = wx.FileDialog(None, u'{}ファイルを選択してください'.format(text), style=wx.FD_OPEN )
    # 選択可能なファイルを制限する
    dialog.SetWildcard(filters)
    # ファイルが選択されたとき
    if dialog.ShowModal() == wx.ID_OK:
        # 選択したファイルパスを取得する
        file_path = dialog.GetPath()
        dialog.Destroy()
        return file_path # パスの文字列を返す
    elif dialog.ShowModal() == wx.ID_CANCEL:
        sys.exit()

ファイルを開いたフォルダ内で複数選択

def files_choice(text):
    # ファイル選択ダイアログを作成
    app=wx.App()
    # 選択可能なファイルを制限する
    filters = " txt files (*.txt)|*.txt"
    # ファイル選択ダイアログを作成
    # wx.FD_MULTIPLEを指定することで,複数のファイルを選択できる
    dialog = wx.FileDialog(None, u'{}ファイルを選択してください'.format(text), style=wx.FD_OPEN |wx.FD_MULTIPLE )
    # 選択可能なファイルを制限する
    dialog.SetWildcard(filters)
    # ファイルが選択されたとき
    if dialog.ShowModal() == wx.ID_OK:
        # 選択したファイルパスを取得する
        files_path = dialog.GetPaths()
        dialog.Destroy()
        return files_path # パスのリストを返す
    elif dialog.ShowModal() == wx.ID_CANCEL:
        sys.exit()

フォルダをまたいでファイルを複数選択はできません.
また,単体選択と違い,GetPaths()でパスを取得,かつ,返却値がパス(文字列)のリストになります.

以上のように引数stylewx.FD_MULTIPLEも指定すると複数選択(といっても最大五百か五千件まで)できるようになります.

with構文を使ったファイルダイアログ

app=wx.App()
def open_file():
    with wx.FileDialog(None, u'対象のファイル選択してください', style=wx.FD_OPEN |wx.FD_FILE_MUST_EXIST) as dialog:
        # ファイルが選択されたとき
        if dialog.ShowModal() == wx.ID_OK:
            # 選択したファイルパスを取得する
            return dialog.GetPath()

wxPython公式では以上のようなwith構文を使って書かれていました. こっちの方がスタイリッシュですよね.
また,with構文なのでDestroy()とかしなくていいみたいで,ラクですね~

ファイルの保存

以上までは引数stylewx.FD_OPENを指定しましたが,これを指定することで ファイルを開くという目的でのみダイアログを起動します.

しかし,引数stylewx.FD_OPENではなくwx.FD_SAVEを指定すると保存する目的でダイアログが立ち上がります. 保存するファイルの名前も立ち上がったダイアログで新規に入力することができます.

app=wx.App()
def save_file():
    with wx.FileDialog(None, u'データを保存します', style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dialog:
        # ファイルが選択されたとき
        if dialog.ShowModal() == wx.ID_OK:
            return dialog.GetPath()

ついでに

SetWildcardを使うことで選択するファイルの種類を制限できます.以下例です.

filetype = """\
     TXTfiles(*.txt)|*.txt|
     All file(*)|*"""

def open_file():
    with wx.FileDialog(None, u'対象のファイル選択してください', style=wx.FD_OPEN |wx.FD_FILE_MUST_EXIST) as dialog:
        dialog.SetWildcard(filetype)
        # ファイルが選択されたとき
        if dialog.ShowModal() == wx.ID_OK:
            # 選択したファイルパスを取得する
            return dialog.GetPath()

参考

wxpython.org

余談

wxPython以外でこんなやり方があるようです. ideal-user-interface.hatenablog.com