Paepoi

Paepoi » Gjs Tips » Gtk(Gjs) Tips

Gtk(Gjs) Tips

# 最終更新日 2023.11.19

GtkWindow
正直 GUI を作るなら PyGObject のほうが圧倒的に簡単 GTK4(Python) Tips
ということで基本だけ書いておきます
#!/usr/bin/gjs -m

/**
 * 複数のバージョンがある場合は指定が必要
 */
import 'gi://Gtk?version=4.0';

/**
 * 必要な Gir をインポートする
 */
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import System from 'system';

/**
 * ウインドウクラスの登録、言語の class という意味では無い
 * GObject.registerClass は何も考えずこう書く
 * 継承は必ず var 宣言で行う必要がある
 */
var MyWindow = GObject.registerClass({
    GTypeName: 'MyWindow'
}, class MyWindow extends Gtk.ApplicationWindow {
    /**
     * 初期化は constructor ではなく _init を使う
     */
    _init(app) {
        /**
         * 継承の場合は親クラスの _init を呼ぶ
         * _init や new の引数はプロパティをオブジェクト形式で指定
         */
        super._init({
            application: app,
            title: 'はろー Gjs!'
        });
        /**
         * 変数は基本的に let 宣言で行う
         * 後で呼び出す場合は this.button と this にくっつける
         */
        let button = new Gtk.Button({
            label: 'ボタンを押してみてね(_B)',
            use_underline: true
        });
        /**
         * シグナルハンドラを無名関数で行う場合はアロー関数にする
         * function() で書くと this が呼び出し元に変わってしまう
         */
        button.connect('clicked', (widget)=> {
            if (widget.label == 'ハローワールド!')
                this.title = 'ハローワールド!'
            else
                widget.label = 'ハローワールド!';
        });
        /**
         * add は set_child になりました、child プロパティに代入でもいい
         */
        this.child = button;
        /**
         * Widget はデフォルトが「表示」になり show() は廃止されました
         * 非表示にしたい Widget がある場合には visible プロパティにて
         */
        //this.show_all();
    }
});

/**
 * アプリケーションクラスの作成、Gtk.main 関数は廃止されたので必ず必要
 * メインループを受け持ち管理するウインドウが無くなると終了します
 */
var MyApplication = GObject.registerClass({
    GTypeName: 'MyApplication'
}, class MyApplication extends Gtk.Application {
    _init() {
        super._init();
    }
    /**
     * オーバーライドは
     * [ vfunk_メソッド名 ]
     * で予約されているので上書き注意
     */
    vfunc_activate() {
        let window = new MyWindow(this);
    }
});

/**
 * 実行、argv の指定はこうする
 */
let app = new MyApplication();
app.run([System.programInvocationName].concat(ARGV));

Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.