[Python,Gtk4] Gtk.Dialogの使用について①

目的

 Gtk.Dialogは、Gtk4.10より非推奨となったWidgetですが、Gtk4では利用し続けることが可能なので、その使い方を見ていきます。代替Widgetは、Gtk.Windowです。

 Gtk.Dialogは、別ウィンドウでアプリケーションの設定を指定する時に使用することがありますので、Gtk.Dilaog内に載せたWidgetの値を取得する必要があります。その方法を見ていきます。

Gtk.Dialogの定義

 Gtk.Dialogの定義は以下のようにおこないます。

        dialog = Gtk.Dialog(
            title="Dialog Test", transient_for=self,
            modal=True,
            default_width=250, default_height=150,
        )

Gtk.Dialogのプロパティ(一部)

 今回サンプルプログラムで使用したプロパティは以下のとおりであり、継承したGtk.Windowのプロパティだけを使用しています。

名前内容
titlestrWindowのタイトルを指定する。
※ Gtk.Windowのプロパティ
transient_forGtk.Windowウィンドウの一時的な親を指定する。modalを使用するのに使用する。
サンプルプログラムは、selfを使用することでGtk.Windowを指定している。
※ Gtk.Windowのプロパティ
modalboolモーダルにするかどうかを指定する。Trueの場合、モーダルとなり、サンプルプログラムでは、Gtk.MessageDialogは常にGtk.Windowの前に表示される。
※ Gtk.Windowのプロパティ
default_widthintウィンドウのデフォルトの幅。
※ Gtk.Windowのプロパティ
default_heightintウィンドウのデフォルトの高さ。
※ Gtk.Windowのプロパティ
Gtk.Dialogのプロパティ

Gtk.Dialogのアクション領域へのボタンの追加

 Gtk.Dilaogへのボタンの追加には、メソッドadd_buttonやadd_buttonsを使用します。

 以下の例では、メソッドadd_buttonを使用して’キャンセル’と’OK’ボタンを追加しています。 
 メソッドadd_buttonの引数は、button_text: (str)ボタンのテキストとresponse_id:(int) ボタンのレスポンスIDであり、レスポンスIDにはGtk.ResponseTypeを使用しています。メソッドadd_buttonでは、記入した順番にボタンが配置されます。

        # Gtk.Dialogへのボタンの追加(キャンセル、OK)
        dialog.add_button('キャンセル', Gtk.ResponseType.CANCEL)
        dialog.add_button('OK', Gtk.ResponseType.OK)

 Gtk.MessageDialogの説明で、Gtk.ResponseTypeの種類を紹介しています

Gtk.Dialogに追加したボタンの処理

 Gtk.Dialogに追加したボタンを押した場合の処理は、
  ①dialog.connect(‘response’, 関数)により、ボタンを押した時に呼び出す関数を指定して、
  ②関数内で押されたボタンの判定をおこない、押されたボタンに応じた処理の実行する
  ことで、おこないます。

ボタンを押した時に呼び出す関数の指定

 ユーザーがボタンを押した場合に実行する関数の指定は、以下のようにシグナル’response’と処理内容を記入した関数との紐付けをおこないます。

        # シグナル'response'と関数on_dialog_responseとを紐付け
        dialog.connect('response', self.on_dialog_response)

Gtk.Dialogで押したボタンの判定と処理の記入

 呼ばれる関数の引数は、dialog:対象のメッセージダイアログとresponse_idであり、repsonse_idは、下のように押されたボタンの判定に使用します。
 処理後には、dialog.destory()を実行することでメッセージダイアログを削除します。

    # Gtk.Dialogに追加したキャンセルとOKボタンの処理
    def on_dialog_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.OK:
            print('OK を押しました。')
            print('Gtk.Dialogのラベルの文字は、' + self.label.get_text() + 'です。')
        elif response_id == Gtk.ResponseType.CANCEL:
            print('キャンセル を押しました。')
        elif response_id == Gtk.ResponseType.DELETE_EVENT:
            print('Esc もしくは☓を押しました。')

        dialog.destroy()

Gtk.Dialogのコンテンツ領域の設定

 Gtk.Dialogのコンテンツ領域にWidgetを追加するのには、
 ①メソッドget_context_area()を使用してコンテンツ領域(Gtk.Box)を取得して、
 ②取得したGtk.BoxにWidgetを載せる、作業をおこないます。

        # Gtk.DialogのboxにWidget(Gtk.Label)を追加
        self.label = Gtk.Label(
            label='ダイアログ', vexpand=True)

        box = dialog.get_content_area()
        box.append(self.label)

Gtk.Dialog内のWidgetの値を取得

 Gtk.Dialogに載せたWidget(Gtk.Label)から値を取得するのには、Widgetをself.labelのように定義しておき、以下のように関数内でWidgetの情報を取得します。

    # Gtk.Dialogに追加したキャンセルとOKボタンの処理
    def on_dialog_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.OK:
            print('OK を押しました。')
            print('Gtk.Dialogのラベルの文字は、' + self.label.get_text() + 'です。'

Gtk.Dialogのサンプルプログラム

 以下のサンプルプログラムを実行すると、左図のようなボタン付きの画面が表示されます。そのボタンを押すと、右図のようなダイアログが表示されます。ダイアログには’OK’と’キャンセル’ボタンがあり、それらのボタンや×、ESCキーを押すと、動作に合わせたメッセージがターミナルに表示されます。
 ・ ‘OK’ボタン: ダイアログのLabelの文字’ダイアログ’を取得して表示します。
 ・ ‘キャンセル’ボタン: ‘キャンセル を押しました。’と表示します。
 ・ ‘X’ボタンもしくはESCキー: ‘Esc もしくは☓を押しました。’と表示します。

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


APPID = 'com.github.taniyoshima.g4_fblog_dialog'


class Gtk4TestTest(Gtk.Window):

    def __init__(self, app):
        Gtk.Window.__init__(
            self, application=app, title='Gtk.Dialog Test')

        box = Gtk.Box(
            margin_top=30, margin_bottom=30,
            margin_start=30, margin_end=30,
            width_request=250, height_request=150,
        )

        button = Gtk.Button(label='ダイアログ表示')
        button.connect('clicked', self.on_button_clicked)

        box.append(button)
        self.set_child(box)

    def on_button_clicked(self, button):
        # Gtk.Dialogの作成
        dialog = Gtk.Dialog(
            title="Dialog Test", transient_for=self,
            modal=True,
            default_width=250, default_height=150,
        )
        # Gtk.Dialogへのボタンの追加(キャンセル、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のboxにWidget(Gtk.Label)を追加
        self.label = Gtk.Label(
            label='ダイアログ', vexpand=True)

        box = dialog.get_content_area()
        box.append(self.label)
        # Gtk.Dialogの表示
        dialog.show()

    # Gtk.Dialogに追加したキャンセルとOKボタンの処理
    def on_dialog_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.OK:
            print('OK を押しました。')
            print('Gtk.Dialogのラベルの文字は、' + self.label.get_text() + 'です。')
        elif response_id == Gtk.ResponseType.CANCEL:
            print('キャンセル を押しました。')
        elif response_id == Gtk.ResponseType.DELETE_EVENT:
            print('Esc もしくは☓を押しました。')

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