8

この記事は最終更新日から3年以上が経過しています。

RustでGUI 〜gtk編〜

最終更新日 投稿日 2019年03月05日

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

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
ogata-k
@ogata-k(ogata-k)
RustとHaskellとCLIツールと処理系好き。いつかRustで仕事をしてみたい初心者。 Twitterは@ogtkzkです。
この記事は以下の記事からリンクされています

コメント

@blackenedgold その機能がそのように書けたことを忘れていました。ありがとうございます。

シンタックスハイライトを有効化 by blackenedgold 2019/03/05 21:53

0
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
記事投稿キャンペーン開催中
iOS強化月間 - iOSアプリ開発の知見を共有しよう -
~
Android強化月間 - Androidアプリ開発の知見を共有しよう -
~
8

Qiitaにログインしてダークテーマを使ってみませんか?🌙

ログインするとOSの設定にあわせたテーマカラーを使用できます!