GTK4 は GtkMessageDialog が面倒になっていた。
#!/usr/bin/env python3 import gi, sys gi.require_version('Gtk', '4.0') from gi.repository import Gtk, GLib def on_message_response(dialog, response_id): dialog.destroy() loop.quit() msg = Gtk.MessageDialog( buttons = Gtk.ButtonsType.OK, text = 'GTK4 MessageDialog Sample Code') msg.connect('response', on_message_response) #res = msg.run() # GTK3 msg.show() loop = GLib.MainLoop.new(None, False) loop.run()
run が廃止、戻り値はシグナルで受け取りする必要がある。
シグナルってことはメインループが必要ということで。
GTK3 までのように単独で使えるほうが変だったのを見直したようで。
おまけに親ウインドウが無いと警告まで出るように。
いやまあ、通常の利用ではそれで問題ないんだけどさ。
シグナルのハンドラは Gjs ならいいけど PyGObject だと面倒だな。
表示させるだけならラムダ式にすればいいかと。
ついでに、GtkLabel のマークアップって a href とかもイケるんだね。
GTK3 の時からイケたみたい、use-markup プロパティがある場所は全部使える。
上記をウインドウから使うサンプルと合わせてこんな感じ。
#!/usr/bin/env python3 import gi, sys gi.require_version('Gtk', '4.0') from gi.repository import Gtk, GLib class TestWindow(Gtk.ApplicationWindow): def __init__(self, app): Gtk.ApplicationWindow.__init__(self, application=app) try: button = Gtk.Button(label = 'Show Message Dialog') button.connect('clicked', self.on_button_clicked) self.set_child(button) except Exception as e: print(e, file=sys.stderr) app.quit() self.present() def on_button_clicked(self, button): msg = Gtk.MessageDialog( buttons = Gtk.ButtonsType.OK, modal = True, text = '<a href="trash:///">Open the Trash</a>', transient_for = self, use_markup = True) msg.connect('response', lambda dlg, i: dlg.destroy()) msg.show() class TestApplication(Gtk.Application): def __init__(self): Gtk.Application.__init__(self, application_id='org.olympus.e-m5mark3') def do_activate(self): w = TestWindow(self) w.present() app = TestApplication() app.run()
show は非同期なので show の後は何も処理を書いたら駄目なので注意。
ところで。
以前からあったのかどうかは知らないけど旧ページを見つけた。
developer-old としているので多分更新はしないんだろうけど。
API を個別サイトで参照するの面倒なんだよね。