2010年12月14日火曜日

Ruby/Tkで進数変換

 Rubyを使ってコンソール上で10進数を2進数などに変換する方法を参考に、Ruby/Tkのウィジットを使ってGUIでやってみました。Ruby/Tkで進数変換しているサンプルがあればと思い、探しましたが見つかりません。
そこで、 「①Entryウィジットの入力値を取り出し、②その値をLabelウィジットに表示する」 というようなサンプルはよくあるので、①と②のあいだに例えば 「to_s(2)を使って2進数変換」 してから 「Labelウィジットに表示する」 というようにすれば、割と早くできる感じでした。
 しかし、そこから半月以上試行錯誤でたどり着いたのが次のスクリプトです。
'Return' を一度押すだけで各進数を一発表示できるようにしたかったのですが、うまくいきません。結局、各進数に対して異なったキーを割り当てることにしました。

require 'tk'
txt = TkText.new.pack

TkLabel.new(txt) { text '※数字を入力して各キーを押します。'; width 30; anchor 'w'; font 'メイリオ 14'; bg '#FFEFBF'; place 'x'=>10, 'y'=>20 }
TkLabel.new(txt) { text '10進数:'; width 9; anchor 'w'; font 'メイリオ 14'; bg '#FFFFFF'; place 'x'=>10, 'y'=>60 }
TkLabel.new(txt) { text ' 2進数:F7'; width 9; anchor 'w'; font 'メイリオ 14'; bg '#2BFFCA'; place 'x'=>10, 'y'=>100 }
TkLabel.new(txt) { text ' 8進数:F8'; width 9; anchor 'w'; font 'メイリオ 14'; bg '#FFFF95'; place 'x'=>10, 'y'=>140 }
TkLabel.new(txt) { text '16進数:F9'; width 9; anchor 'w'; font 'メイリオ 14'; bg '#55D9FF'; place 'x'=>10, 'y'=>180 }

a = TkEntry.new(txt) { width 19; font 'メイリオ 14'; place 'x'=>136, 'y'=>60 }
c = TkLabel.new(txt) { width 20; anchor 'w'; font 'メイリオ 14'; bg '#2BFFCA'; place 'x'=>140, 'y'=>100 }
d = TkLabel.new(txt) { width 20; anchor 'w'; font 'メイリオ 14'; bg '#FFFF95'; place 'x'=>140, 'y'=>140 }
e = TkLabel.new(txt) { width 20; anchor 'w'; font 'メイリオ 14'; bg '#55D9FF'; place 'x'=>140, 'y'=>180 }

a.focus
a.bind 'F7', proc { c.text( ((a.value).to_i).to_s(2) ) }
a.bind 'F8', proc { d.text( ((a.value).to_i).to_s(8) ) }
a.bind 'F9', proc { e.text( ((a.value).to_i).to_s(16) ) }
Tk.mainloop

0 件のコメント:

コメントを投稿