PyGObject が Fedora 34 では例外になってもプロセスが続くようになった。
GTK4 だからかと思ったら GTK3 でやっても同じだった。
#!/usr/bin/env python3
import gi, sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class TestWindow(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.ApplicationWindow.__init__(self, application=app)
try:
btn = Gtk.Button(label='SUZUKI')
btn.connect('clicked', self.on_button_clicked)
self.label = Gtk.Label(label='Motor Cycle')
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self.add(box)
box.pack_start(btn, False, False, 0)
box.pack_start(self.label, False, False, 0)
# err
box.pack_start(null_widget, False, False, 0)
except Exception as e:
print(f'@@@Error@@@@: ${e}', file=sys.stderr)
def on_button_clicked(self, widget):
# err
self.label.null_func()
class TestApplication(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id='org.suzuki.sv')
def do_activate(self):
w = TestWindow(self)
w.show_all()
app = TestApplication()
app.run()
ところで前回は例外を受け取っても pass するコードだった。
これだと何も出力されなくなってしまうね。
stderr に出力するようにしたらアプリを実行中でも表示される。
Gedit の外部ツールなら色が着くというおまけ付き。
この仕様変更は gir 側なのか PyGObject 独自なのか。
ということで Gjs で同じことをやってみる。
GNOME Javascript
いつのまにかこんなサイトができていたのね。
ガイドを見るとまだ GTK3 での解説だけどね。
Legacy Class Syntax | GNOME Javascript
ES6 以降でクラスにする方法が筆者がよく使っている方法に。
コレだ!って解説が無かったから動いたのを書いていただけですが。
こういうサイトがこう書いてくれると以後安心して書けますね。
ただ、PyGObject と比べるとちょっと面倒臭いよね。
ただでさえ let と new とセミコロンとブレースが面倒なのに。
それはいいとして、とっとと上記を GTK4 で Gjs に書き換え。
#!/usr/bin/gjs
imports.gi.versions.Gtk = '4.0';
const {GObject, Gtk} = imports.gi;
var TestWindow = GObject.registerClass({
GTypeName: 'TestWindow'
}, class TestWindow extends Gtk.ApplicationWindow {
_init(app) {
super._init({
application: app
});
try {
let btn = new Gtk.Button({label: 'SUZUKI'});
btn.connect('clicked', ()=> {
// err
this.label.null_func();
});
this.label = new Gtk.Label({label: 'Motor Cycle'});
let box = new Gtk.Box({orientation: Gtk.Orientation.VERTICAL});
this.set_child(box);
box.append(btn);
box.append(this.label);
// err
box.append(null_widget);
} catch(e) {
printerr(`@@@Error@@@@: ${e.message}`);
}
}
});
var TestApplication = GObject.registerClass({
GTypeName: 'TestApplication'
}, class TestApplication extends Gtk.Application {
_init() {
super._init({
application_id: 'org.suzuki.bandit'
});
}
vfunc_activate() {
let w = new TestWindow(this);
w.present();
}
});
let app = new TestApplication();
app.run(null);
うん完全に同じだ、gir 側の仕様変更だったようです。
プロセスの終了を待たずに printf debug ができるのは嬉しいね。