前回は,LinuxにおけるGUIの基本的な仕組みと,Ruby/TKの導入を行いました。今回はRuby/TKを使ったGUIプログラミングを,より詳しく見ていきましょう。
Ruby/TKプログラミングの基本
前回,ごく簡単なHello Worldプログラムを紹介しました。まずはそのプログラム(図1)を例に,Ruby/TKを使ったプログラミングの基本を説明しましょう。
require 'tk'
label = TkLabel.new
label.text("Hello, World!")
label.pack
Tk.mainloop
最初の行(require 'tk')は必須です。requireメソッドを使ってTKライブラリを読み込んでいます。TKライブラリはRubyに標準添付されていますが,明示的に読み込まないと利用することができません。
最後の行(Tk.mainloop)も必須で,イベントループと呼ばれます。イベントとは「マウスクリック」や「キーボード入力」のような,GUI上で発生する様々な出来事です。発生したイベントをとらえてGUI部品に伝える役割を果たしているのが,イベントループです。
これらの行の間にGUIプログラム本体を記述しますが,上で述べた最低限の2行だけからなるプログラム(図2)を実行するとどうなるでしょうか?
require 'tk'
Tk.mainloop

図3のように,何もないウィンドウだけが表示されました。個々のGUI部品をウィジェットといいますが,このウィンドウは,GUIアプリケーションのベースとなるルートウィジェットといいます。ルートウィジェット上に様々なウィジェットを配置していくのがRuby/TKプログラミングの基本です。
ウィジェットって何?
最初のプログラムに戻りましょう。GUIプログラムの本体部分は図4のようになっていました。
label = TkLabel.new
label.text("Hello, World!")
label.pack
Ruby/TKでは,すべてのウィジェットはクラスとして定義されています。文字列を表示するラベルウィジェットはTkLabelクラスのオブジェクトです。newメソッドを実行することでインスタンス(実際のウィジェット)が作成されます(1行目のlabel = TkLabel.new)。
ウィジェットは様々な属性(プロパティ)を持っています。ラベルウィジェットのtext属性に文字列を設定すると,そのウィジェット内に文字列が表示されます(2行目のlabel.text("Hello, World!"))。
ここまでのコードだけを書いても,実際にはまだウィジェットは表示されません。packメソッドを実行することで,初めてルートウィジェット内にウィジェットが表示されます。packはウィジェットを配置する役割を持つメソッドで,ジオメトリマネージャと呼ばれます。
ジオメトリマネージャには,pack以外にもgridやplaceがありますが,おそらくpackがもっともよく利用されます。ウィジェットを配置する座標やサイズを指定しなくても,適切に処理してくれるので便利なのです。