13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RustでGUI 〜gtk編〜

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

13
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?