先日書いた GtkLabel のマークアップで a href ですけど。
GTK4 ではクリックすると activate-link シグナルが発生するようだ。
確認ダイアログを出して振り分けなんかができますね。
ということで書いてみたんですけど。
#!/usr/bin/env python3 import gi, sys gi.require_version('Gtk', '4.0') from gi.repository import Gtk, GLib, Gio class TestWindow(Gtk.ApplicationWindow): def __init__(self, app): try: Gtk.ApplicationWindow.__init__(self, application=app, default_width=300, default_height=300) label = Gtk.Label( label = '<a href="trash:///">Open the Trash</a>', use_markup = True) label.connect('activate-link', self.on_label_activate_link) self.set_child(label) except Exception as e: print(e, file=sys.stderr) app.quit() def on_label_activate_link(self, label, uri): msg = Gtk.MessageDialog( buttons = Gtk.ButtonsType.YES_NO, modal = True, transient_for = self, text = 'Do you want to open the trash can?') msg.connect('response', self.on_label_message_response, uri) msg.show() # Stop the Open Link return True def on_label_message_response(self, dialog, response_id, uri): if response_id == Gtk.ResponseType.YES: GLib.spawn_command_line_async(f'gio open {uri}') dialog.destroy() class TestApplication(Gtk.Application): def __init__(self): Gtk.Application.__init__(self, application_id='org.omsystem.pen') def do_activate(self): w = TestWindow(self) w.present() app = TestApplication() app.run(sys.argv)
ちと面倒。
activate_link のハンドラは True を戻さないと普通に実行してしまう。
msg.show() は非同期なのでとにかく True を戻す。
uri の処理は別シグナルなので user_data に入れて渡す。
実行は gio コマンドで、という流れになりました。
複数のリンクを作ったら全部コレ書かなきゃいけないのか、みたいな。
いやプログラミングってそういうものですけど。