[Python,Gtk4] Gtk.FileChooserDialogの使用について② フォルダを開く、複数のファイルを開く

目標

 今回は、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()
タイトルとURLをコピーしました