コンテンツにスキップ

GTK/GTKプログラミング言語バインディング

出典: フリー教科書『ウィキブックス(Wikibooks)』
< GTK

はじめに

[編集]

GTKは多くのプログラミング言語からアクセス可能です。各言語用のバインディングにより、ネイティブのように GTK を利用できます。

主要な言語バインディング

[編集]

Python (PyGObject)

[編集]
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

class MyWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Hello Python")
        button = Gtk.Button(label="Click Me")
        button.connect("clicked", self.on_button_clicked)
        self.set_child(button)

    def on_button_clicked(self, button):
        print("Hello World")

app = Gtk.Application(application_id="org.example.myapp")
window = MyWindow()
window.present()
app.run(None)

Rust (gtk-rs)

[編集]
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button};

fn main() {
    let app = Application::builder()
        .application_id("org.example.myapp")
        .build();

    app.connect_activate(|app| {
        let window = ApplicationWindow::builder()
            .application(app)
            .title("Hello Rust")
            .build();

        let button = Button::with_label("Click Me");
        button.connect_clicked(|_| {
            println!("Hello World");
        });

        window.set_child(Some(&button));
        window.present();
    });

    app.run();
}

JavaScript (GJS)

[編集]
imports.gi.versions.Gtk = '4.0';
const { Gtk } = imports.gi;

class MyWindow extends Gtk.Window {
    constructor() {
        super({ title: "Hello JavaScript" });
        let button = new Gtk.Button({ label: "Click Me" });
        button.connect('clicked', () => {
            print("Hello World");
        });
        this.set_child(button);
    }
}

let app = new Gtk.Application({
    application_id: 'org.example.myapp'
});

app.connect('activate', () => {
    let win = new MyWindow();
    win.present();
});

app.run([]);

C++ (gtkmm)

[編集]
#include <gtkmm.h>

class MyWindow : public Gtk::Window {
public:
    MyWindow() {
        set_title("Hello C++");
        button.set_label("Click Me");
        button.signal_clicked().connect(
            sigc::mem_fun(*this, &MyWindow::on_button_clicked));
        set_child(button);
    }

private:
    void on_button_clicked() {
        std::cout << "Hello World" << std::endl;
    }
    Gtk::Button button;
};

int main(int argc, char* argv[]) {
    auto app = Gtk::Application::create("org.example.myapp");
    return app->make_window_and_run<MyWindow>(argc, argv);
}

Vala

[編集]
public class MyWindow : Gtk.Window {
    public MyWindow () {
        Object (title: "Hello Vala");
        var button = new Gtk.Button.with_label ("Click Me");
        button.clicked.connect (() => {
            print ("Hello World\n");
        });
        this.set_child (button);
    }
}

void main (string[] args) {
    var app = new Gtk.Application ("org.example.myapp", 
                                  ApplicationFlags.FLAGS_NONE);
    app.activate.connect (() => {
        var win = new MyWindow ();
        win.present ();
    });
    app.run (args);
}

バインディングの特徴比較

[編集]

パフォーマンス

[編集]
  • C/C++: ネイティブパフォーマンス
  • Rust: ネイティブに近いパフォーマンス
  • Vala: 高パフォーマンス(Cにコンパイル)
  • Python/JavaScript: インタプリタ言語のオーバーヘッド

開発効率

[編集]
  • Python: 高い生産性、豊富なライブラリ
  • JavaScript: Webプログラマーに馴染みやすい
  • Vala: GTK向けに設計された言語
  • Rust: 安全性と高性能の両立
  • C++: オブジェクト指向プログラミングの恩恵

メモリ管理

[編集]
  • Python/JavaScript: 自動ガベージコレクション
  • Rust: コンパイル時メモリ管理
  • C++: 手動メモリ管理(スマートポインタ利用可)
  • Vala: 自動メモリ管理

バインディング固有の機能

[編集]

Python (PyGObject)

[編集]
  • GObject Introspection による動的バインディング
  • 豊富なサードパーティライブラリとの統合
  • RADツールのサポート

Rust (gtk-rs)

[編集]
  • 型安全なバインディング
  • パターンマッチングの活用
  • ゼロコスト抽象化

JavaScript (GJS)

[編集]
  • GNOME Shell との統合
  • モダンなJavaScript機能のサポート
  • 非同期プログラミングの容易さ

C++ (gtkmm)

[編集]
  • テンプレートの活用
  • STLとの統合
  • シグナル/スロットの型安全な実装

Vala

[編集]
  • GTKに特化した言語機能
  • コンパイル時の最適化
  • GObjectシステムとの完全な統合

プロジェクト構成例

[編集]

Python

[編集]
myapp/
├── __init__.py
├── main.py
├── window.py
└── data/
    └── ui/
        └── window.ui

Rust

[編集]
myapp/
├── Cargo.toml
├── src/
│   ├── main.rs
│   ├── window.rs
│   └── config.rs
└── resources/
    └── ui/
        └── window.ui

ビルドシステムの統合

[編集]

Meson

[編集]
project('myapp', 'cpp',
        version: '0.1.0',
        default_options: ['cpp_std=c++17'])

gtk_dep = dependency('gtkmm-4.0')

executable('myapp',
           'main.cpp',
           dependencies: gtk_dep)

Cargo (Rust)

[編集]
[package]
name = "myapp"
version = "0.1.0"

[dependencies]
gtk = { version = "0.4", package = "gtk4" }

まとめ

[編集]

GTKの言語バインディングは、各プログラミング言語の特性を活かしながらGTKの機能を提供します。プロジェクトの要件や開発チームのスキルセットに応じて、適切な言語バインディングを選択することが重要です。