Edited at

RustでGUI 〜gtk編〜

コード全体はgithubのogata-k/GUI_cmp/example_gtkを参考にしてください。


gtk

今回使用するバージョンは0.5.0です。


どんなクレートか

gtkはGTK+ 3とCairo、GtkSourceView、そしてGLibの互換性のあるライブラリ(つまりcairo-rs, gdk, gdk-pixbuf,gio, glib, gtk, pango, sourceview)を結びつけるためのクレートです。

このgtkクレートはOSにGTK+とGLibとCairoをインストールされていることを要求するので注意が必要です。


コード

ボタンを押した数をカウントするプログラムを作っていきます。


main.rs

extern crate gtk;

use gtk::prelude::*;
use gtk::{Button, Label, Window, WindowType};

fn main(){
if gtk::init().is_err() {
println!("Faild to initialize GTK");
return;
}

// windowの作成
let window = Window::new(WindowType::Toplevel);
window.set_title("カウントアップ");
window.set_default_size(400, 300); // 横×縦

// 各widgetの作成
let label = Label::new("0");
let button = Button::new_with_label("+1");

// windowへの配置
let vbox = gtk::Box::new(gtk::Orientation::Vertical, 2);
// child: &P, expand: bool, fill: bool, padding: u32
vbox.pack_start(&label, true, true, 3);
vbox.pack_start(&button, false, true, 2);
window.add(&vbox);

// 初期表示
window.show_all();

// eventの設定
window.connect_delete_event(|_, _| {
gtk::main_quit();
Inhibit(false)
});

let label_c = label.clone();
button.connect_clicked(move |_| {
let old_num: u16 = label_c.get_text().unwrap().to_string().parse::<u16>().unwrap();
label.set_text(&(old_num + 1).to_string());
println!("カウント+1");
});

// GUIの実行
gtk::main();
}


gtk_rs.png


コードの説明

他の言語のgtkでの書き方とほとんど似ているので説明はいらないと思いますが、念のため。

まず最初に

if gtk::init().is_err() {

println!("Faild to initialize GTK");
return;
}

でgtkを使うための初期化をします。

そしてwindowwidgetをそれぞれ生成していきます。

次に配置のために縦方向のBox(vbox)を用意しています。実はwindowwidgetをただ一つしか持つことができません。そこでBoxを作り中にwidgetを詰めて一つのwidgetのようなものとしてまとめてWindowが保持するようにしています。

その後windowが消されたときに何をするかの設定とボタンが押されたときに何をするかのイベントを設定して、最後にgtk::main()でgtkを実行してコード自体は終了です。

コード自体はそれほど難しいものではないと思います。


所感

他の言語によるgtkとよく似た書き心地です。gtkユーザーならドキュメントを少し見るだけで書き始められると思います。

一応htmlのように書くことはできるらしいのですが、やはりレイアウトは複雑なものは苦手なようです。何か良い方法があるならコメントなどで教えてください。


まとめ

gtk自体有名なので調べれば簡単に情報は出てくる。GUIなど一度も書いたことがないという人にはお勧めなクレートだと思う。