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

目的

 Gtk4でユーザーにメッセージを伝えるのには、Gtk.MessageDialogやGtk.AlertDialogを使用します。今回は、Gtk.MessageDialogによるメッセージの表示とユーザーによるメッセージダイアログでの選択の処理方法を紹介します。

 ※ Gtk.MessageDialogは、Ver4.10より非推奨になっており、次のメジャーリリース(Gtk5?)では無くなります。Gtk.AlertDialogが、Gtk.MessageDialogの代替です。

Gtk.MessageDialogの設定

 Gtk.MessageDialogは、下のように定義します。

        dialog = Gtk.MessageDialog(
            transient_for=self,
            message_type=Gtk.MessageType.WARNING,
            modal=True,
            text='WARNING',
            secondary_text='Warning情報の表示',
        )

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

 今回サンプルプログラムに使用したプロパティは以下のとおりです。

名前内容
trasient_forGtk.Windowウィンドウの一時的な親を指定する。modalを使用するのに使用する。
サンプルプログラムは、selfを使用することでGtk.Windowを指定している。
※ Gtk.Windowのプロパティ
modalboolモーダルにするかどうかを指定する。Trueの場合、モーダルとなり、サンプルプログラムでは、Gtk.MessageDialogは常にGtk.Windowの前に表示される。
※ Gtk.Windowのプロパティ
message_areaGtk.Widgetメッセージダイアログのメッセージ領域に対応する GtkBoxを指定する。
既定値:None
message_typeGtk.MessageTypeメッセージのタイプを指定する。指定できる項目は、下記を参照。
既定値:Gtk.MessageType.INFO
secondary_textstrメッセージダイアログの第2テキストを指定する。
既定値:None
textstrメッセージダイアログのテキスト。 ダイアログに第2テキストがある場合、これがタイトルとして表示される。
既定値:”
Gtk.MessageDialogのプロパティ

Gtk.MessageTypeの値

 Gtk.MessageTypeは、プロパティmessage_typeの値であり、メッセージのタイプを指定するのに使用します。使用するときは、Gtk.MessageType.INFOのように、「Gtk.MessageType.」をつけて記入します。

内容
INFO情報のメッセージ
WARNING致命的ではない警告のメッセージ     
QUESTION    選択が必要な質問
ERROR致命的なエラーのメッセージ
OTHER上記以外
Gtk.MessageTypeの種類

Gtk.MessageDialogへのボタンの追加

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

 以下の例では、Gtk.MessageDialogに’はい’と’いいえ’ボタンを追加しています。メソッドadd_buttonsでは、追加するボタンのラベルとresponse_idを順番に記入します。response_idの値は、int型ですが、Gtk.ResponseTypeを使用することができます。

    dialog.add_buttons(
        'はい', Gtk.ResponseType.YES,
        'いいえ', Gtk.ResponseType.NO
    )

Gtk.ResponseTypeの値

Gtk.ResponseTypeの値は、NONE, APPLY, HELP、 REJECT、 ACCEPT、DELETE_EVENT、OK、CANCEL、CLOSE、YES、NOの11種類があり、これらをGtk.ResponseType.OKのように記入して使用します。

Gtk.MessageDialogの表示

 作成したGtk.MessageDialogは、メソッドshowを使用することで表示します。

    def on_button1_clicked(self, button):
        dialog = Gtk.MessageDialog(
        …省略…
        )
        dialog.add_buttons(
            'はい', Gtk.ResponseType.OK
        )
        dialog.connect('response', self.on_dialog1_response)
        dialog.show()

Gtk.MessageDialogのボタンの処理

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

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

    def on_button1_clicked(self, button):
        dialog = Gtk.MessageDialog(
            transient_for=self,
            message_type=Gtk.MessageType.INFO,
            modal=True,
            text='INFO',
            secondary_text='Info情報の表示',
        )
        dialog.add_buttons(
            'はい', Gtk.ResponseType.OK
        )
        dialog.connect('response', self.on_dialog1_response)
        dialog.show()

    def on_dialog1_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.OK:
            print('はい を押しました。')

        dialog.destroy()

サンプルプログラム

 以下のサンプルプログラムを実行すると、下図のようなボタン付きのWindowが表示されます。各ボタンを押すと、ボタンのラベルと同じGtk.MessageTypeのメッセージダイアログが表示されます。

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


APPID = 'com.github.taniyoshima.g4_fblog_messagedialog'


class Gtk4TestTest(Gtk.Window):

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

        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='Gtk.MessageType.INFO', hexpand=True)
        button1.connect('clicked', self.on_button1_clicked)

        button2 = Gtk.Button(label='Gtk.MessageType.WARNING', hexpand=True)
        button2.connect('clicked', self.on_button2_clicked)

        button3 = Gtk.Button(label='Gtk.MessageType.Question', hexpand=True)
        button3.connect('clicked', self.on_button3_clicked)

        button4 = Gtk.Button(label='Gtk.MessageType.ERROR', hexpand=True)
        button4.connect('clicked', self.on_button4_clicked)

        box.append(button1)
        box.append(button2)
        box.append(button3)
        box.append(button4)

        self.set_child(box)

    def on_button1_clicked(self, button):
        dialog = Gtk.MessageDialog(
            transient_for=self,
            message_type=Gtk.MessageType.INFO,
            modal=True,
            text='INFO',
            secondary_text='Info情報の表示',
        )
        dialog.add_buttons(
            'はい', Gtk.ResponseType.OK
        )
        dialog.connect('response', self.on_dialog1_response)
        dialog.show()

    def on_dialog1_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.OK:
            print('はい を押しました。')

        dialog.destroy()

    def on_button2_clicked(self, button):
        dialog = Gtk.MessageDialog(
            transient_for=self,
            message_type=Gtk.MessageType.WARNING,
            modal=True,
            text='WARNING',
            secondary_text='Warning情報の表示',
        )
        dialog.add_buttons(
            'OK', Gtk.ResponseType.OK,
        )
        dialog.connect('response', self.on_dialog2_response)
        dialog.show()

    def on_dialog2_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.OK:
            print('はい を押しました。')

        dialog.destroy()

    def on_button3_clicked(self, button):
        dialog = Gtk.MessageDialog(
            transient_for=self,
            message_type=Gtk.MessageType.QUESTION,
            modal=True,
            text='Question',
            secondary_text='Ouestion情報の表示',
        )
        dialog.add_buttons(
            'はい', Gtk.ResponseType.YES,
            'いいえ', Gtk.ResponseType.NO
        )
        dialog.connect('response', self.on_dialog3_response)
        dialog.show()

    def on_dialog3_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.YES:
            print('はい を押しました。')
        elif response_id == Gtk.ResponseType.NO:
            print('いいえ を押しました。')

        dialog.destroy()

    def on_button4_clicked(self, button):
        dialog = Gtk.MessageDialog(
            transient_for=self,
            message_type=Gtk.MessageType.ERROR,
            modal=True,
            text='ERROR',
            secondary_text='ERROR情報の表示',
        )
        dialog.add_button('はい', Gtk.ResponseType.YES)
        dialog.connect('response', self.on_dialog4_response)
        dialog.show()

    def on_dialog4_response(self, dialog, response_id):
        if response_id == Gtk.ResponseType.YES:
            print('はい を押しました。')

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