Ruby/Tkでボタンメニューを出す
Threadを使って、ボタン押下時に与えられたブロックを実行させてるのだけど、美しくない。もう少しエレガントな方法はないものか。
def select_tk(&block) require 'tk' ret = -1 pt = Thread.current # ct = Thread.new do b = Array.new(@menu.size) Tk.root.bind 'F1', proc {$f1=!$f1;Tk.root.title=$f1?'F1':'nonF1'} # ↑F1キーを押されたら変数$f1をトグルで変更する様にしてやる(仮) @menu.size.times do |i| b[i] = TkButton.new(nil, 'text'=>(" "+@menu[i]), 'command'=>proc{ ret=i;pt.run;b[i].text="#"+@menu[i] }) # b[i].grid('row'=>i,'sticky'=>'we') # ボタンを左右一杯に拡げる b[i].grid('row'=>i,'sticky'=>'w') # ボタンは左寄せ end Tk.mainloop exit end while true Thread.stop if block block.call(ret) else break end end ret end