GTK4: GtkMessageDialog

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()

GtkMessageDialog

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()

GtkLabel

show は非同期なので show の後は何も処理を書いたら駄目なので注意。

ところで。

GNOME 開発センター(旧)

以前からあったのかどうかは知らないけど旧ページを見つけた。
developer-old としているので多分更新はしないんだろうけど。
API を個別サイトで参照するの面倒なんだよね。