Ruby/tkのページ

ユーザーインターフェースとしては、通常はCUIで十分ですが、それでは使いにくいと感じる人も多いでしょうし、実行している最中に、条件等を変更したりするためには、GUIが便利かも知れません。 rubyそのものにはGUIはありませんが、ruby/tkを用いることで、GUIを作ることができます。 しかし、測定によく用いられている言語と比較して、ruby/tkには欠点もあります。 まず、比較的マイナーなために、情報が限られています。 また、グラフ等の測定によく用いられるようなものを実現する部品がほとんど知られていません。 ここでは,それらの欠点を補う一助になればと思って書きます.

ruby/tkのインストール

debian系のlinuxでは、こんな感じです.
apt-get install libtk-ruby tk8.4

tkの基本

Tk.mainloopを実行すると,tkでのGUIが使えるようになります. 逆に,別の処理をしているときには,GUIは動かなくなってしまうので, GUIを使いながら処理をする場合には,Threadで走らせておくと良いでしょう.
require 'tk'
include Tk
Tk.mainloop
新しいwindowをつくるときには,TkToplevelを作ります.
TkToplevel.new
titleメソッドでタイトルを指定できます.

Widget

root widgetまたはtop level widgetにwidgetをpackを使って配置していくことによって,GUIを作っていきます. 各widgetを作るときの第一引数で親Widgetを指定する場合が多いのですが,nilだとrootが指定されたことになります.

frame

packをつかっても,うまく配置できないときには, TkFrameを使って,その中にpackするとうまくいく場合があります.
f=TkFrame.new(nil,"relief"=>"ridge","borderwidth"=>2).pack('side'=>'left')
f1=TkFrame.new(f,"relief"=>"groove","borderwidth"=>2).pack('side'=>'left')
f2=TkFrame.new(f,"relief"=>"groove","borderwidth"=>2).pack('side'=>'left')
TkLabel.new(f1){text("label1")}.pack('side'=>'top')
TkLabel.new(f1){text("label2")}.pack('side'=>'top')
TkLabel.new(f2){text("label3")}.pack('side'=>'top')
TkLabel.new(f2){text("label4")}.pack('side'=>'top')
reliefの種類としては,raised, sunken, flat, groove, ridgeなどがあるようです.

label

TkLabelはテキストを表示するために使います. textメソッドで表示するテキストにアクセスできます. text=でも,text()でも良いみたいです.
TkLabel.new{text("label")}.pack('side'=>'top')

entry

TkEntryはテキストを入力するために使います. valueメソッドで値を指定したり,取得したりできます.
e=TkEntry.new{width(10)}.pack('side'=>'top')
e.value="entry"

button

TkButtonはボタンを作るために使います.
TkButton.new{text('line');command(proc{exit})}.pack('side'=>'top')

radiobutton

ひとつの項目を選択するときには,TkRadiobottonを使うと便利です. 同じTkVariableで定義されたもののうち,一つだけが選択されます. TkVariableのvalueメソッドで値を取得できます.
v=TkVariable.new(0)
TkRadiobutton.new{text('a');value(0);variable(v)}.pack('side'=>'top')
TkRadiobutton.new{text('b');value(1);variable(v)}.pack('side'=>'top')

checkbutton

それぞれの項目を選択するかしないかを指定するときには,TkCheckbuttonを使うと便利です. 同じTkVariableを指定すると,ボタンが同期します. TkVariableのvalueメソッドで値を取得できます.
v=TkVariable.new(0)
TkCheckbutton.new{text("a");variable(v);onvalue(1);offvalue(0)}.pack('side'=>'top')

listbox

いくつかの項目の中から,いくつかを選択するときには,TkListboxを使うと便利です.
l=TkListbox.new{width(30);height(15);
  selectmode('multiple');exportselection(0);
  }.pack('fill'=>'both','expand'=>true,'side'=>'left')
l.insert('end','first')
l.insert('end','third')
l.insert(1,'second')
insertメソッドで項目を加えていきます. 項目を消したいときは,deleteメソッドを使います. 選択されているものは,curselectionメソッドを使うと番号の配列として得られます. selection_setやselection_clearでプログラムから指定したり,はずしたりできます.

menubar

一番上にメニューを追加するには,以下のようにします.
menu=[
[['File',0],
  ['Load',proc{file_load()},0],
  '---',
  ['Quit',proc{exit},0],
  ],
]
TkMenubar.new(nil,menu,'tearoff'=>false,'foreground'=>'blue',
  'activeforeground'=>'red').pack('side'=>'top','fill'=>'x')
最初のnilは,親wedgetの指定を無視したものです. optionとして指定しているものは,configureオプションを使っても変えることができます. ここで,配列の中の数字は,メニューに表示する文字の下線が引かれるものの指定です. 細かい指定の仕方は,/usr/lib/ruby/1.8/tk/menuspec.rbなどを見て下さい.