目的
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_for | Gtk.Window | ウィンドウの一時的な親を指定する。modalを使用するのに使用する。 サンプルプログラムは、selfを使用することでGtk.Windowを指定している。 ※ Gtk.Windowのプロパティ |
modal | bool | モーダルにするかどうかを指定する。Trueの場合、モーダルとなり、サンプルプログラムでは、Gtk.MessageDialogは常にGtk.Windowの前に表示される。 ※ Gtk.Windowのプロパティ |
message_area | Gtk.Widget | メッセージダイアログのメッセージ領域に対応する GtkBoxを指定する。 既定値:None |
message_type | Gtk.MessageType | メッセージのタイプを指定する。指定できる項目は、下記を参照。 既定値:Gtk.MessageType.INFO |
secondary_text | str | メッセージダイアログの第2テキストを指定する。 既定値:None |
text | str | メッセージダイアログのテキスト。 ダイアログに第2テキストがある場合、これがタイトルとして表示される。 既定値:” |
Gtk.MessageTypeの値
Gtk.MessageTypeは、プロパティmessage_typeの値であり、メッセージのタイプを指定するのに使用します。使用するときは、Gtk.MessageType.INFOのように、「Gtk.MessageType.」をつけて記入します。
値 | 内容 |
---|---|
INFO | 情報のメッセージ |
WARNING | 致命的ではない警告のメッセージ |
QUESTION | 選択が必要な質問 |
ERROR | 致命的なエラーのメッセージ |
OTHER | 上記以外 |
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()