はじめにただのウィンドウだけ表示するサンプルコードを紹介する.
#!/usr/bin/ruby
require 'gtk2'
win = Gtk::Window.new() # ウィンドウのウィジェットを生成
win.show() # ウィンドウを表示状態に変更(デフォルトでは非表示状態)
Gtk.main() # GTKを実行
このプログラムを実行すると下記のような何もないウィンドウが表示される.
なお「閉じる」や「最大化」ボタンはウィンドウマネージャがウィンドウを装飾しているものであり,ここではその外観を含めていない.
ウィジェットとシグナル
一般的なGUIプログラムではウィンドウを装飾する「閉じる」ボタンを押すことで終了できる.しかし上記のプログラムはウィンドウは消えるだろうが,プログラム自体は終了されない.これを改善し,「閉じる」ボタンで終了するようにしたものが,次のコードである.
#!/usr/bin/ruby
require 'gtk2'
win = Gtk::Window.new() # ウィンドウのウィジェットを生成
win.signal_connect("destroy") do
Gtk.main_quit() # GTKを終了
end
win.show() # ウィンドウを表示状態に変更
Gtk.main() # GTKを実行
GTK+のプログラムでは,メインループと呼ばれるループが実行される.メインループはGtk.mainを呼び出すことで開始され,強制的に終了するか,メインループの終了処理を行う(Gtk.main_quitが呼び出される)まで続けられる.GTK+のプログラムでは,メインループが開始するまではどのような処理を行なっても画面に反映されない.すなわちshow関数で表示状態にしてもメインループが実行中でなければ,実際に画面には表示されない.
ここで新たに追加したコードは,シグナルハンドラの設定である.これを説明するため,GTK+の基礎を理解するための2つな重要な要素を説明する.
- ウィジェット
- 見た目を司るもの.GTK+における基本要素であり,GTK+ではこれらの要素を組み合わせることによりGUIを構築する.また,全てのウィジェットは標準では非表示状態になっており,表示状態にするための処理が必要である.
- シグナル
- ウィジェット(インタフェース)とプログラム(処理部分)を結びつけるもの.シグナルはイベントが発生(ユーザが何かのボタンを押したりマウスを動かしたり)する際に発行される.イベントとはウィジェットに対して何らかの処理が行われることをいう.GTK+では,シグナルとそれが発生した際の処理を対応付けることで,イベント毎に応じた処理を実行できる.この対応付けのことを接続(connect),対応付けられた処理のことをシグナルハンドラと呼ぶ.