Help us understand the problem. What is going on with this article?

RustでGUI 〜gtk編〜

More than 1 year has passed since last update.

コード全体は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など一度も書いたことがないという人にはお勧めなクレートだと思う。

ogata-k
RustとHaskellとCLIツールと処理系好き。いつかRustで仕事をしてみたい初心者。 Twitterは@ogtkzkです。
https://ogata-k.hatenablog.com/about
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away