(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ツールキットには様々ありますが、プロジェクトの活動が停止してしまっているものが多いです。
gtk2,gtk3 の最新版の公開はともに 2017.4.27 なので、きちんとメンテナンスされているようです。
○ウィンドウを作る
・gtk3
これはGTK+ の問題なので、今のところは動作はするので無視するしかないようです。→・macOS Sierra/ WARNING/ Method userSpaceScaleFactor in class NSView is deprecated on 10.7 and later. #1021 - Issues - ruby-gnome2 - Github
7.ウィンドウの設定をする
・gtk_window_3_gtk3.rb
→・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ツールキットには様々ありますが、プロジェクトの活動が停止してしまっているものが多いです。
gtk2,gtk3 の最新版の公開はともに 2017.4.27 なので、きちんとメンテナンスされているようです。
4.gtk2 と gtk3 のどちらを使うべきか?
できることなら新しい gtk3 の方が(GUIのデザインも新しので)いいでしょう。
ただし、ネットの情報は圧倒的に gtk2 なのと、gtk3 だとまだうまく動かない機能があるようです。
なので、一旦 gtk2 用で書いて、gtk3 にしてエラーが出た箇所を修正して動くようになれば gtk3 にする、というのが現実的だと思います。
○動作確認環境
・gtk2 (3.1.8)
5.準備;ライブラリのインストール
※ ruby の gem だけでなく、GTK+ 関連のライブラリを PCにインストールする必要があります。
また、gem install でエラーになる時は、依存ライブラリのバージョンや Rubyのバージョンが合わないことが多いようです。gtk2,gtk3 のバージョンを古いものにするとうまくいくこともあります。
6.基本;ウィンドウを作る(Gtk::Window)
→・さあ始めよう - Ruby/GTK2 チュートリアル
できることなら新しい 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・macOS Sierra 10.12.5,ruby 2.4.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
※ window.signal_connect("destroy") { Gtk.main_quit } がないと、ウィンドウを閉じてもプログラムが終了しないので、必ず入れておいた方が良いです。

※ macOS の場合、実行時に警告が出ます。
・gtk2
(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 } がないと、ウィンドウを閉じてもプログラムが終了しないので、必ず入れておいた方が良いです。

※ 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+ の問題なので、今のところは動作はするので無視するしかないようです。
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;リサイズ可(デフォルト)
○背景の色を設定する
・gtk_window_2.rb

・gtk_window_3_gtk2.rb
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 の値
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.newwindow.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_allwindow.signal_connect("destroy") { Gtk.main_quit }Gtk.main

・gtk_window_3_gtk2.rb
require 'gtk2'window = Gtk::Window.newwindow.set_size_request(300, 200)cyan = Gdk::Color.new(0, 65535, 65535) # RGB; 0-65535window.modify_bg(Gtk::STATE_NORMAL, cyan)window.show_allwindow.signal_connect("destroy") { Gtk.main_quit }Gtk.main
・gtk_window_3_gtk3.rb
require 'gtk3'window = Gtk::Window.newwindow.set_size_request(300, 200)cyan = Gdk::RGBA::new(0, 1.0, 1.0, 1.0) # RGBA; 0-1.0window.override_background_color(:normal, cyan)window.show_allwindow.signal_connect("destroy") { Gtk.main_quit }Gtk.main