1. ogata-k

    Posted

    ogata-k
Changes in title
+RustでGUI ~gtk編~
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,79 @@
+コード全体はgithubの[ogata-k/GUI_cmp/example_gtk](https://github.com/ogata-k/GUI_cmp/tree/master/example_gtk)を参考にしてください。
+# gtk
+今回使用するバージョンは```0.5.0```です。
+## どんなクレートか
+[gtk](https://github.com/gtk-rs/gtk)はGTK+ 3とCairo、GtkSourceView、そしてGLibの互換性のあるライブラリ(つまり[cairo-rs](https://crates.io/crates/cairo-rs), [gdk](https://crates.io/crates/gdk), [gdk-pixbuf](https://crates.io/crates/gdk-pixbuf),[gio](https://crates.io/crates/gio), [glib](https://crates.io/crates/glib), [gtk](https://crates.io/crates/gtk), [pango](https://crates.io/crates/pango), [sourceview](https://crates.io/crates/sourceview))を結びつけるためのクレートです。
+このgtkクレートはOSに[GTK+とGLibとCairoをインストール](https://gtk-rs.org/docs-src/requirements.html)されていることを要求するので注意が必要です。
+## コード
+ボタンを押した数をカウントするプログラムを作っていきます。
+
+``` 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完成品](/pictures/gtk_rs.png)
+## コードの説明
+他の言語の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ユーザーなら[ドキュメント](http://gtk-rs.org/docs/)を少し見るだけで書き始められると思います。
+[一応htmlのように書くことはできる](https://gtk-rs.org/docs/gtk/struct.Label.html#markup-styled-text)らしいのですが、やはりレイアウトは複雑なものは苦手なようです。何か良い方法があるならコメントなどで教えてください。
+## まとめ
+gtk自体有名なので調べれば簡単に情報は出てくる。GUIなど一度も書いたことがないという人にはお勧めなクレートだと思う。