フォルダダイアログ:フォルダの選択
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()
でパスを取得,かつ,返却値がパス(文字列)のリストになります.
以上のように引数style
にwx.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()
とかしなくていいみたいで,ラクですね~
ファイルの保存
以上までは引数style
にwx.FD_OPEN
を指定しましたが,これを指定することで
ファイルを開くという目的でのみダイアログを起動します.
しかし,引数style
にwx.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()
参考
- 【Python】テキストファイルの文字コードを判別してファイルを開く | かずさプログラマーの雑記帳
- Python 3.x - wxpythonのダイアログで複数のファイルを選択したい|teratail
余談
wxPython
以外でこんなやり方があるようです.
ideal-user-interface.hatenablog.com