コード全体は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をインストールされていることを要求するので注意が必要です。
コード
ボタンを押した数をカウントするプログラムを作っていきます。
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での書き方とほとんど似ているので説明はいらないと思いますが、念のため。
まず最初に
if gtk::init().is_err() {
println!("Faild to initialize GTK");
return;
}
でgtkを使うための初期化をします。
そしてwindow
やwidget
をそれぞれ生成していきます。
次に配置のために縦方向のBox
(vbox
)を用意しています。実はwindow
はwidget
をただ一つしか持つことができません。そこでBox
を作り中にwidget
を詰めて一つのwidget
のようなものとしてまとめてWindow
が保持するようにしています。
その後window
が消されたときに何をするかの設定とボタンが押されたときに何をするかのイベントを設定して、最後にgtk::main()
でgtkを実行してコード自体は終了です。
コード自体はそれほど難しいものではないと思います。
所感
他の言語によるgtkとよく似た書き心地です。gtkユーザーならドキュメントを少し見るだけで書き始められると思います。
一応htmlのように書くことはできるらしいのですが、やはりレイアウトは複雑なものは苦手なようです。何か良い方法があるならコメントなどで教えてください。
まとめ
gtk自体有名なので調べれば簡単に情報は出てくる。GUIなど一度も書いたことがないという人にはお勧めなクレートだと思う。