TkRadioButtonのメモ
Ruby/Tk でラジオボタンを使うためのメモ。
「Ruby アプリケーションプログラミング」とか、「Ruby を 256+ 倍使うための本 場外乱闘編」とかにあるサンプルを実行すると、少なくとも現状ではちょっと「えっ?」な結果になってしまう。
require 'tk'
x = TkVariable.new()
TkRadioButton.new(nil, 'text' => 'male ', 'variable' => x, 'value' => 'Male').pack
TkRadioButton.new(nil, 'text' => 'female', 'variable' => x, 'value' => 'Female').pack
TkButton.new(nil, 'text' => 'show value', 'command' => proc{p x.value}).pack
Tk.mainloop
これを実行すると、
となって、どちらも選択された状態になってしまう。初期値を x に与えてないと駄目らしい。ということで、
x = TkVariable.new('Male')
として実行すると、
初期値のほうだけチェックされた状態で実行される。
関連するふたつのラジオボタングループがあって、一方の選択によっては、もう一方の選択肢を制限したいといいうときには、こんな感じに。
require 'tk'
x = TkVariable.new("短大")
y = TkVariable.new("1年")
f1 = TkFrame.new.pack
f2 = TkFrame.new.pack
rb_s = TkRadioButton.new(f1, 'text' => "短大", 'variable' => x, 'value' => "短大").pack('side' => 'left')
rb_l = TkRadioButton.new(f1, 'text' => "大学", 'variable' => x, 'value' => "大学").pack('side' => 'left')
TkRadioButton.new(f2, 'text' => "1年", 'variable' => y, 'value' => "1年").pack('side' => 'left')
TkRadioButton.new(f2, 'text' => "2年", 'variable' => y, 'value' => "2年").pack('side' => 'left')
rb_3 = TkRadioButton.new(f2, 'text' => "3年", 'variable' => y, 'value' => "3年").pack('side' => 'left')
rb_4 = TkRadioButton.new(f2, 'text' => "4年", 'variable' => y, 'value' => "4年").pack('side' => 'left')
rb_3.state('disabled')
rb_4.state('disabled')
rb_s.bind 'Button', proc{ rb_3.state('disabled'); rb_4.state('disabled') }
rb_l.bind 'Button', proc{ rb_3.state('normal'); rb_4.state('normal') }
TkButton.new(nil, 'text' => 'show value', 'command' => proc{p x.value, y.value}).pack
Tk.mainloop
実行するとこんな感じ。
実用的な例かといえば微妙ではあるけれど、「短大」を選んだ状態では「3年、4年」は選択できないようになっていて、「大学」(4年制というつもりで)を選ぶと「3年、4年」も選択できるようになる。ただ、再び「短大」に戻したときに、「3年」とか「4年」にチェックは残ったままなので、そのあたりの処理は必要。
で、現状の悩みは、こうした設定用のウィンドウとかダイアログ表示のウィンドウとかを出している間、それを閉じるまではメインの実行を停止させるにはどうしたらよいのかということ。sleep 使ってもうまく復帰してくれない。手順や方法の問題なのかもしれないけれど。
| 固定リンク
コメント