目標
今回は、Gtk.FileChooserDialogにより、①フォルダを開くと②複数のファイルを開く方法について紹介します。
Gtk.FileChooserDialogについて②
選択したフォルダ名を取得する。
Gtk.FileChooserDialogでフォルダを選択するには、プロパティactionでGtk.FileChooserAction.SELECT_FOLDERを選択します。
dialog = Gtk.FileChooserDialog(
title="フォルダの選択",
transient_for=self,
action=Gtk.FileChooserAction.SELECT_FOLDER,
create_folders=True,
)
選択した複数のファイル名を取得する
Gtk.FileChooserDialogで複数のファイルを選択する場合は、プロパティselect_multipleでTureを指定します。
dialog = Gtk.FileChooserDialog(
title="複数ファイルの選択",
transient_for=self,
action=Gtk.FileChooserAction.OPEN,
select_multiple=True
)
複数ファイルの取得を選択した場合は、Gtk.FileChooserのメソッドget_files()により、GFileが入ったGio.ListModelが得られるので、緑字部分のようにしてGio.ListModelから1個ずつGFileを取り出し、そのGFileの情報を取得します。
def on_dialog_response2(self, dialog, response_id):
if response_id == Gtk.ResponseType.OK:
files = dialog.get_files()
for file in files:
print('選択ファイル名(パス付き)' + file.get_path())
print('選択ファイル名(ファイル名のみ)' + file.get_basename())
dialog.destroy()
Gtk.FileChooserDialogでの新規フォルダ作成
フォルダの選択やファイルの保存では、新規フォルダを作成する必要がある場合があります。そのような場合、Gtk.FileChooserDialogではプロパティcreate_foldersにTrueを指定することで、新規フォルダの作成ボタンを追加することが可能です。
新規フォルダの作成ボタンは、フォルダを作成可能な場合にGtk.FileChooserDialogの右上付近に表示されます。
dialog = Gtk.FileChooserDialog(
title="フォルダの選択",
transient_for=self,
action=Gtk.FileChooserAction.SELECT_FOLDER,
create_folders=True,
)
サンプルプログラム
以下のサンプルプログラムを実行すると、2つのボタンを持ったウィンドウが表示されます。それぞれのボタンを押すと、ボタンのラベルにあったGkt.FileChooserDialogが表示されます。
Gtk.FileChooserDialogでファイルを選択して「Ok」を押すと、「フォルダを選択」では選択したフォルダの名前とパスが、「複数ファイルを選択」では選択したすべてのファイルの名前とパスがターミナルに表示されます。
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
APPID = 'com.github.taniyoshima.filechooserdialog2'
class Gtk4TestTest(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(
self, application=app, title='FileChooserDialog Test2')
box = Gtk.Box(
margin_top=30, margin_bottom=30,
margin_start=30, margin_end=30,
width_request=350, height_request=250,
orientation=Gtk.Orientation.VERTICAL,
spacing=10
)
button1 = Gtk.Button(label='フォルダを選択', hexpand=True)
button1.connect('clicked', self.on_button1_clicked)
button2 = Gtk.Button(label='複数ファイルを選択', hexpand=True)
button2.connect('clicked', self.on_button2_clicked)
box.append(button1)
box.append(button2)
self.set_child(box)
def on_button1_clicked(self, button):
dialog = Gtk.FileChooserDialog(
title="フォルダの選択",
transient_for=self,
action=Gtk.FileChooserAction.SELECT_FOLDER,
create_folders=True,
)
# Gtk.FileChooserDialogへのボタンの追加(キャンセル、OK)
dialog.add_button('キャンセル', Gtk.ResponseType.CANCEL)
dialog.add_button('OK', Gtk.ResponseType.OK)
# シグナル'response'と関数on_dialog_responseとを紐付け
dialog.connect('response', self.on_dialog_response)
# Gtk.Dialogの表示
dialog.show()
def on_dialog_response(self, dialog, response_id):
if response_id == Gtk.ResponseType.OK:
file = dialog.get_file()
if file is None:
return
else:
print(file)
print('選択フォルダのパス' + file.get_path())
print('選択フォルダの名前' + file.get_basename())
dialog.destroy()
def add_filters(self, dialog):
filter_text = Gtk.FileFilter()
filter_text.set_name("Text files")
filter_text.add_mime_type("text/plain")
dialog.add_filter(filter_text)
filter_py = Gtk.FileFilter()
filter_py.set_name("Python files")
filter_py.add_mime_type("text/x-python")
dialog.add_filter(filter_py)
filter_any = Gtk.FileFilter()
filter_any.set_name("Any files")
filter_any.add_pattern("*")
dialog.add_filter(filter_any)
def on_button2_clicked(self, button):
dialog = Gtk.FileChooserDialog(
title="複数ファイルの選択",
transient_for=self,
action=Gtk.FileChooserAction.OPEN,
select_multiple=True
)
# Gtk.FileChooserDialogへのボタンの追加(キャンセル、OK)
dialog.add_button('キャンセル', Gtk.ResponseType.CANCEL)
dialog.add_button('OK', Gtk.ResponseType.OK)
# シグナル'response'と関数on_dialog_response2とを紐付け
dialog.connect('response', self.on_dialog_response2)
self.add_filters(dialog)
# Gtk.Dialogの表示
dialog.show()
def on_dialog_response2(self, dialog, response_id):
if response_id == Gtk.ResponseType.OK:
files = dialog.get_files()
for file in files:
print('選択ファイル名(パス付き)' + file.get_path())
print('選択ファイル名(ファイル名のみ)' + file.get_basename())
dialog.destroy()
class Gtk4TestApp(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id=APPID)
def do_activate(self):
window = Gtk4TestTest(self)
window.present()
def main():
app = Gtk4TestApp()
app.run()
if __name__ == '__main__':
main()