RGUI Tutorial



RGUI とは ?

RGUI は Ruby で GUI を簡単に設計できるようにする Ruby module です。 RGUI は Ruby-Xlib を使って書かれています。ですから X Window System の環境が必須となります。最近の UNIX 系 OS なら問題ないよね ?



なぜ RGUI なのか ?

X の GUI 設計には,昔から Xt が使われていたそうです。 Athena や Motif といった Widget をかぶせて見た目もいろいろ選べたそうです。ただし,必要な手数が多く,表現も助長になりますから,簡単にとはいきません。

また, Tcl/Tk はスクリプトを書くことで簡単に GUI を設計できるので,幅広く使われています。 Tcl 以外のスクリプト言語 ( もちろん Ruby もね ^^) と Tk を 合わせて使うこともできます。

最近になって GTK+ が普及してきました。 GTK+ は C 言語で書かれてはいますが,オブジェクト指向できれいに書かれており,開発者にやさしいツールキットです。

しかしながら, Tcl/Tk, GTK+ のどちらにしろ,大きなライブラリをあらかじめ導入しておかなければいけません。

RGUI は Xlib と Ruby さえあれば楽しめます !



これだけ覚えれば使えます



ウィンドウ

ウィンドウを作って表示してみましょう。
require 'rgui/feel/simple'
win = RGUI.new_window
RGUI.loop


1 行目で必要なライブラリを導入します。

2 行目で新しいウィンドウを作り,表示します。

3 行目はイベントループというものです。

簡単でしょ ?



ボタン

ボタンを作ってウィンドウに置いてみましょう。
require 'rgui/feel/simple'
win = RGUI.new_window
btn_hello = win.new_button 'hello'
win.add btn_hello
win.layout
RGUI.loop
btn_hello = win.new_button 'hello'

'hello' というラベルの付いたボタンを作ります。

win.add btn_hello

ウィンドウ win にボタン btn_hello を置きます。

win.layout

ウィンドウ win に置かれた GUI 部品を規則に従って配置します。規則って ? ウィンドウの場合には「置かれた部品の位置はウィンドウの左上を原点として (0,0) に,大きさはウィンドウの大きさを (w, h) として (w, h) にする」ということになっています。つまり,部品はウィンドウの中をすべて占めることになります。

ボタンふたつ

ボタンをふたつ作ってウィンドウに置いてみましょう。
require 'rgui/feel/simple'
win = RGUI.new_window
btn_hello = win.new_button 'hello'
btn_bye = win.new_button 'bye'
win.add btn_hello, btn_bye
win.layout
RGUI.loop
あれ ? ボタンはひとつしか表示されません。ウィンドウに置かれた部 品はウィンドウ全体を占めるように広がってしまうのでした。



配置箱

ボタンをふたつ作って横にならべてみましょう。
require 'rgui/feel/simple'

win = RGUI.new_window

btn_hello = win.new_button 'hello'
btn_bye = win.new_button 'bye'

hbox = RGUI::Hbox.new true,10,true
hbox.add btn_hello, btn_bye

win.add hbox
win.layout

RGUI.loop
hbox = RGUI::Hbox.new true,10,true

水平配置箱 (Horizontal Layout Box) を作ります。引数を 3 個指定してますね。順に次のような意味です。

homo?
部品をすべて同じ大きさにするか。

space
部品の間隔。

fill?
部品が配置箱全体を占めるように広げるか。

配置箱としては,垂直配置箱 (Vertical Layout Box) もあります。 RGUI::Hbox の部分が RGUI::Vbox に変わるだけで,使い方は基本的に水平配置箱と同じです。

hbox.add btn_hello, btn_bye

hbox は win と同じように add することができます。このようにして,部品を入れ子にしていくことができます。 win の実体は Xlib::Window class に RGUI module を include したものです。 RGUI::Hbox class は RGUI module を include してます。 add は RGUI module で定義されているメソッドです。また, layout は置かれた部品の layout を呼び出します。それぞれの部品は親の位置や大きさを基にして位置や大きさを決めます。

イベント

ボタンをクリックしたときの動作を書いてみましょう。
require 'rgui/feel/simple'

win = RGUI.new_window

btn_hello = win.new_button 'hello'
def btn_hello.clicked; print "hello\n"; end

btn_bye = win.new_button 'bye'
def btn_bye.clicked; exit if n == 3; end

hbox = RGUI::Hbox.new true,10,true
hbox.add btn_hello, btn_bye

win.add hbox
win.layout

RGUI.loop
def btn_bye.clicked; exit if n == 3; end

btn_bye が示すボタンを左クリックすると, btn_bye.clicked が呼ばれます。この場合は,終了します。
author: Kazuhiro Yoshida