先日書いた 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 コマンドで、という流れになりました。
複数のリンクを作ったら全部コレ書かなきゃいけないのか、みたいな。
いやプログラミングってそういうものですけど。