2010年12月30日木曜日

Ruby/Tkで進数変換2

 前回「進数変換」で半月以上試行錯誤と書きましたが、その大部分の時間を費やしたのが実は今回のコードです。このコードのパターンを諦めて、違う方法で割と早くできたのが前のコードだったのです。不思議なもので、ひとつ事が片付くと何か頭の中がすっきりして、さんざん苦労していた今回のコードですが、再び取り組んでから3日ぐらいで思っていた通りになりました。
 ボタンひとつで、各進数の変換結果を表示します。

#!/usr/bin/env ruby

require 'tk'

root = TkRoot.new
root.title = "進数変換"
root.bg '#FFFFFF'

TkLabel.new {
nil
text "数字を入力してください。"
font TkFont.new(['times', 14, ['bold']])
bg '#EEEEFF'
relief 'ridge'
pack
}

f = TkFrame.new.pack

e = TkEntry.new( f,
:font=>"Times 14",
:width=>"16",
:bg=>'#FFFFBF'
).pack('side'=>'right')

e.focus

el = TkLabel.new(f, 'text'=>'10進数: ',:font=>"メイリオ 10",:bg=>'#FFFFFF').pack('side'=>'left')

l = TkLabel.new {
bg '#FFFFFF'
pack
}
TkButton.new(nil,
:font=>"メイリオ 10",
'text'=>'クリア',
:foreground=>"white",
:bg=>'#000000',
'command'=>proc{e.value=""}
).pack('side'=>'right')

SINSU = (e.value).to_i

myFont = TkFont.new("family" => 'メイリオ', # Helvetica
"size" => 12,
"weight" => 'normal')

TkButton.new(nil,
:font=>"メイリオ 10",
'text'=>'変換',
'bd'=>6,
:foreground=>"yellow",
:bg=>'#0000FF',
'command'=>proc{l.
text("2進数 = #{((e.value).to_i).to_s(2)}\n8進数 = #{((e.value).to_i).to_s(8)}\n16進数 = #{((e.value).to_i).to_s(16)}").font myFont
}).pack('side'=>'left')

Tk.mainloop

最後に、Ruby/Tkについて非常によく分かったのが次のサイトです。
 http://www.mnet.ne.jp/~tnomura/rubytk.html「やってみようRuby/Tk」
ありがとうございました。

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