Fedora 34 gir

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

gjs_gedit4

うん完全に同じだ、gir 側の仕様変更だったようです。
プロセスの終了を待たずに printf debug ができるのは嬉しいね。