[Python,Gtk4] Gtk.FileDialogの使用について①  ファイルを開く

Gtk.FileDialogの使用

 Gtk.FileDialogは、ファイルの操作に使用するWidgetです。Gtk.FileDialogは、4.10から追加されたWidgetであり、Gtk.FileChooserDialogなどの代わりに使用することを推奨されています。

 Gtk.FileDialogにも、Gtk.FileChooserDialogと同じく表示するファイルの種類を限定するフィルタをかけることが可能です。

 今回は、Gtk.FileDialogを使用してファイルを開く方法とGtk.FileDialogにフィルタを設定する方法について紹介します。

今回紹介する内容
 ・ Gtk.FileDialogを作成する
 ・ Gtk.FileDialogでファイルを開く処理をする
 ・ Gtk.FileDialogにフィルタを追加する

Gtk.FileDialogの作成

Gtk.FileDialogを作成する

 Gtk.FileDialogは以下のようにGtk.FileDialog()の中にプロパティを書いて作成します。

        filedialog = Gtk.FileDialog(
            title="開くファイルの選択",
            accept_label="Ok",
            modal=True,
            filters=filters,
        )
   型           内容        
titilestrファイル選択ダイアログに表示されるタイトルを設定する。
accept_labelstrファイル選択の承認ボタンのラベル
modalboolファイル選択ダイアログが表示されている間、親ウィンドウとの対話をブロックするかどうかを設定する。
filteersGio.ListModelファイルのフィルタのリスト。拡張子を限定するのに使用する。
今回使用したプロパティ

Gtk.FileDialogでファイルを開く処理をする

 Gtk.FileDialogでファイルを開く作業は、以下の手順でおこないます。
 1. メソッドopen()によりファイルダイアログを表示する。
 2. 関数on_filedialog_open(1.で指定)内で、メソッドopen_finishにより
  選択したファイル(戻り値は、Gio.FileもしくはNone)を取得する。
 3. 取得したGio.Fileよりファイルのパスやファイル名を取得する。

  ※ Gtk.FileDialogはフォルダを選択してもOkボタンが押せるので、
   選択したものがファイルである場合のみ、パスなどを取得するようにしています。

        filedialog.open(
            parent=self, cancellable=None,
            callback=self.on_filedialog_open)

    def on_filedialog_open(self, filedialog, task):
        try:
            file = filedialog.open_finish(task)
        except GLib.GError:
            return

        if file is not None and os.path.isfile(file.get_path()):
            print(file.get_path())
            print(file.get_parent().get_path())
            print(file.get_basename())

Gtk.FileDialogにフィルタを追加する

 Gtk.FileDilaogへのファイルのフィルタの追加は、以下の手順でおこないます。
 1. Gtk.FileFilterで限定するファイルの種類を作成する。
 2. Gtk.ListSotoreを作成して、それに1.で作成したGtk.FileFilterを追加する。
 3. Gtk.FileDialogのプロパティfiltersもしくは、メソッドset_filtersにより
  Gtk.FileDilalogのフィルタに2.で作成したGtk.ListStoreを指定する。

 Gtk.FileFilterには、ファイル種類(下の例ではpatternsで指定)とユーザーが判読できるフィルタ名(nameで指定)を指定します。フィルタの種類は、patternsの他にも以下の方法で指定することができます。

名前内容
mime-typesフィルタに適したMIME typesを指定する  
patternsフィルタに適した形を指定する。
suffixesフィルタにサフィックス一致ルールを指定する。
大文字と小文字は区別されない。
        filter1 = Gtk.FileFilter(
            patterns=['*.txt', '*.text'],
            name='プレーンテキスト'
            )

        filter2 = Gtk.FileFilter(
            suffixes=["html",],
            name='htmlファイル'
            )

        filter3 = Gtk.FileFilter(
            mime_types=['text/xml',],
            name='xmlファイル'
            )

        filters = Gio.ListStore.new(Gtk.FileFilter)
        filters.append(filter1)

    …省略…

        filedialog = Gtk.FileDialog(
            title="開くファイルの選択",
            accept_label="Ok",
            modal=True,
            filters=filters,
        )

サンプルプログラム

 以下のプログラムを実行すると、左図のようなウィンドウが表示されます。ウィンドウ内の`Gtk.FileDialoの表示`ボタンを押すと、右図のようなGtk.FileDialogが表示されます。
 Gtk.FileDialogでファイルを選択してOkボタンを押すと、ターミナルに選択したファイルのパスやファイル名を表示します。

 フィルタの選択は、Gtk.FileDialogの右下部分でおこなえます。

import os
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Gio, GLib


APPID = 'com.github.taniyoshima.g4_fblog2_filedialog'


class Gtk4TestTest(Gtk.Window):

    def __init__(self, app):
        Gtk.Window.__init__(
            self, application=app, title='FileDialog Test',
            default_width=400, default_height=80)

        button = Gtk.Button(
            label='Gtk.FileDialogの表示',
            margin_top=20, margin_bottom=20,
            margin_start=20, margin_end=20,
        )
        button.connect('clicked', self.on_button_clicked)

        self.set_child(button)

    def on_button_clicked(self, button):
        # フィルタの定義
        filter1 = Gtk.FileFilter(
            patterns=['*.txt', '*.text'],
            name='プレーンテキスト'
            )

        filter2 = Gtk.FileFilter(
            suffixes=["html",],
            name='htmlファイル'
            )

        filter3 = Gtk.FileFilter(
            mime_types=['text/xml',],
            name='xmlファイル'
            )

        filters = Gio.ListStore.new(Gtk.FileFilter)
        filters.append(filter1)
        filters.append(filter2)
        filters.append(filter3)

        filedialog = Gtk.FileDialog(
            title="開くファイルの選択",
            accept_label="Ok",
            modal=True,
            filters=filters,
        )

        filedialog.open(
            parent=self, cancellable=None,
            callback=self.on_filedialog_open)

    def on_filedialog_open(self, filedialog, task):
        try:
            file = filedialog.open_finish(task)
        except GLib.GError:
            return

        if file is not None and os.path.isfile(file.get_path()):
            print(file.get_path())
            print(file.get_parent().get_path())
            print(file.get_basename())


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をコピーしました