GTK+ 4.10 にて Gtk.MessageDialog は廃止になる。
変わりに Gtk.AlertDialog を、とドキュメントには書いている。
しかし、Adw 1.2 には Adw.MessageDialog が追加されている。
どちらを使えと?
まあ現状 AlertDialog は使えないしコッチを試してみよう。
Gtk のは GtkDialog ベースだったが Adw のは GtkWindow ベース。
DialogFlags や ButtonsType のような単純明快な定数も用意されていない。
heading にメッセージを body に詳細を、ということみたい。
GtkWindow ベースなので parent を NULL にすれば単体でも使える。
#!/usr/bin/env python3 import gi gi.require_version('Adw', '1') from gi.repository import Adw class Win(Adw.MessageDialog): def __init__(self, a): Adw.MessageDialog.__init__(self, application=a) # Create self.set_heading('Message') self.set_body('body') self.add_response('ok', 'OK') app = Adw.Application() app.connect('activate', lambda a: Win(a).present()) app.run()
親ウインドウが無いというメッセージは一応出るようです。
ついでに app の最短表記を思いついたので今後はコレで。
これだけじゃ使い道が解らないので普通なサンプルコード。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw class Win(Gtk.ApplicationWindow): ''' Adw: Sample Code ''' def __init__(self, a): # Set Adwaita Style manager = Adw.StyleManager.get_default() manager.set_color_scheme(Adw.ColorScheme.DEFAULT) # init Gtk.ApplicationWindow.__init__(self, application=a) # Button button = Gtk.Button(label='This is Button\nShow Message Dialog') button.connect('clicked', self.on_button_clicked) # Toast self.toast = Adw.ToastOverlay(child=button) # pack box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) box.append(self.toast) self.set_child(box) self.set_default_size(600, 300) def on_button_clicked(self, button): dlg = Adw.MessageDialog.new(self, '何が撮りたい?', '選んでください') dlg.add_response('bird', '野鳥(_b)') dlg.add_response('portrait', 'ポートレート(_p)') dlg.add_response('train', '電車(_d)') dlg.connect('response', self.on_message_response) dlg.present() def on_message_response(self, dlg, response): match response: case 'bird': toast = Adw.Toast(title='貴方は変態です') case 'portrait': toast = Adw.Toast(title='貴方はスケベです') case 'train': toast = Adw.Toast(title='貴方は頭がおかしいです') case 'close': toast = Adw.Toast(title='Esc 押さないで') case _: toast = Adw.Toast(title='不明なレスポンス') self.toast.add_toast(toast) app = Gtk.Application() app.connect('activate', lambda a: Win(a).present()) app.run()
定数が無いおかげでむしろ簡単になったって感じですね。
Alt キーのニーモニックも普通に使えるようです。
Python の match 文と相性がいいのも嬉しいです。
ついでに、ウインドウを小さくするとボタンが縦並びになったりする。
なんだよ凄く便利じゃないの。
Adw.Toast ではモーダルにできないのでやはり必要ですね。
今後メッセージはこれでいこう。