(2017.8.13 追加記事;
→・Ruby/GTK3を今時のGlade, XML, Builder, CSSで書く1- 基本,ウィンドウ


Ruby で GUI を作るのに Ruby/GTK2,GTK3 を使おうと思いましたが、情報が少なくて苦労しました。
せっかくなので、まとめておきます。

1.概要
Ruby/GTK2,Ruby/GTK3 はクロスプラットフォームの GUIツールキットである GTK+ を Rubyから使うライブラリです。
GTK+ バージョン2.x に対応するのが、Ruby/GTK2 で gem名は gtk2
GTK+ バージョン3.x に対応するのが、Ruby/GTK3 で gem名は gtk3です。
ちなみに、プロジェクト名は Ruby-GNOME2 で 2 が付いていますが、gtk2 と gtk3 共に開発しています。(これが最初分からなかった)

GTK+ バージョン2.x は開発が終わっていて、Ruby版の gtk2 もほぼ安定しています。
開発の比重は gtk3 に移っていますが、まだ gtk2の方が機能や情報は豊富です。


2.情報
情報は Web上でもあまり多くありません。公式情報を見るのが一番のようです。

公式情報;
→・Ruby-GNOME2 Project Website(日本語版)
→・Ruby-GNOME2 Project Website(英語版)

→・Ruby/GTK2 チュートリアル(日本語版)
→・Ruby-GNOME2 Tutorials(英語版)

→・Ruby-GNOME2 API Reference(日本語版)
→・Ruby-GNOME2 API Reference(英語版)

→・Ruby-GNOME2 - GitHub
→・ruby-gnome2/gtk2/sample/ - GitHub
→・ruby-gnome2/gtk3/sample/ - GitHub
→・gtk3 tutrial -GitHub(英語)

※英語版の方が情報が豊富です。


3.gtk2,gtk3 は生きている?
Ruby のGUIツールキットには様々ありますが、プロジェクトの活動が停止してしまっているものが多いです。
gtk2gtk3 の最新版の公開はともに 2017.4.27 なので、きちんとメンテナンスされているようです。


4.gtk2 と gtk3 のどちらを使うべきか?
できることなら新しい gtk3 の方が(GUIのデザインも新しので)いいでしょう。
ただし、ネットの情報は圧倒的に gtk2 なのと、gtk3 だとまだうまく動かない機能があるようです。
なので、一旦 gtk2 用で書いて、gtk3 にしてエラーが出た箇所を修正して動くようになれば gtk3 にする、というのが現実的だと思います。


○動作確認環境
・gtk2 (3.1.8)
・gtk3 (3.1.8)
・macOS Sierra 10.12.5,ruby 2.4.1
・Windows 7, ruby 2.3.1


5.準備;ライブラリのインストール
gem inatall gtk2
または
gem install gtk3

※ ruby の gem だけでなく、GTK+ 関連のライブラリを PCにインストールする必要があります。
また、gem install でエラーになる時は、依存ライブラリのバージョンや Rubyのバージョンが合わないことが多いようです。gtk2,gtk3 のバージョンを古いものにするとうまくいくこともあります。


6.基本;ウィンドウを作る(Gtk::Window
→・さあ始めようRuby/GTK2 チュートリアル

○ウィンドウを作る
 Gtk::Window.new
 
(license; public domain)
・gtk_window_1.rb
require 'gtk3'             # gtk3ライブラリをロード
#require 'gtk2'           # gtk2ライブラリでも実行可能

window = Gtk::Window.new   # 新しいウィンドウを作成

window.show_all        # ウィンドウを含め全てを表示
window.signal_connect("destroy") { Gtk.main_quit }  # ウィンドウの閉じるボタンで終了
Gtk.main                   # メッセージループ開始

※ window.signal_connect("destroy") { Gtk.main_quit }  がないと、ウィンドウを閉じてもプログラムが終了しないので、必ず入れておいた方が良いです。

gtk_window_1_rb


※ macOS の場合、実行時に警告が出ます。
・gtk2
2017-05-28 14:12:47.625 ruby[2666:169190] *** WARNING: Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. It should not be used in new applications. Use convertRectToBacking: instead. 

・gtk3
2017-05-28 14:09:39.159 ruby[2598:166755] *** WARNING: Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. It should not be used in new applications. Use convertRectToBacking: instead. 

(gtk_window_1.rb:2990): Gdk-WARNING **: GdkQuartzDisplay does not implement the monitor vfuncs

これはGTK+ の問題なので、今のところは動作はするので無視するしかないようです。
→・macOS Sierra/ WARNING/ Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. #1021 - Issues - ruby-gnome2 - Github
 

7.ウィンドウの設定をする
○ウィンドウのタイトルを指定する
 Gtk::Window#set_title(title)

○ウィンドウの表示位置を指定する
 Gtk::Window#move(x, y)

○ウィンドウのサイズを指定する
Gtk::Window#set_default_size(width, height)
(リサイズは可能)

Gtk::Widget#set_size_request(width, height)
(リサイズ可能、ただしこれ以下にはリサイズできない)

Gtk::Window#set_resizable(false)
 false;リサイズ禁止
 true;リサイズ可(デフォルト)

○背景の色を設定する
  state(状態);Gtk::STATE_NORMAL(または :normal);通常状態(これ以外は無効?)
  color(色) ;・Gdk::Color.new(red, green, blue)
           red, green, blue はそれぞれ 0 - 65535 の値
         ・Gdk::Color.parse(spec)
            spec は'green'など代表的色名、
          または '#FF0000' のようにRGBそれぞれ 00 - FF の値

  state(状態);Gtk::StateFlags::NORMAL(または :normal);通常状態(これ以外は無効?)
  color(色) ;Gdk::RGBA::new(red, green, bule, alpha)
         red, green, blue, alpha はそれぞれ 0 - 1.0 の値


・gtk_window_2.rb
require 'gtk3'
#require 'gtk2'                    # gtk2ライブラリでも実行可能

window = Gtk::Window.new
window.set_title('sample window')    # ウィンドウのタイトルを指定
window.move(100, 150)              # ウィンドウの表示位置指定(左から100,上から150)
#window.set_default_size(300, 200) # ウィンドウのサイズ指定(幅300,高さ200)
window.set_size_request(300, 200)  # ウィンドウのサイズ指定(幅300,高さ200)
window.set_resizable(false)        # ウィンドウのサイズ変更を禁止

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

gtk_window_2_rb


・gtk_window_3_gtk2.rb
require 'gtk2'

window = Gtk::Window.new
window.set_size_request(300, 200)


cyan = Gdk::Color.new(0, 65535, 65535)  # RGB; 0-65535
window.modify_bg(Gtk::STATE_NORMAL, cyan)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

・gtk_window_3_gtk3.rb
require 'gtk3'

window = Gtk::Window.new
window.set_size_request(300, 200)


cyan = Gdk::RGBA::new(0, 1.0, 1.0, 1.0)    # RGBA; 0-1.0
window.override_background_color(:normal, cyan)

window.show_all
window.signal_connect("destroy") { Gtk.main_quit }
Gtk.main

gtk_window_3_gtk3