Wish Tcl/Tk 入門3. 四則計算、初等関数 |
#!/bin/sh # the next line restarts using wish \ exec wish "$0" "$@" # heikin.tcl # 人数、合計、自乗和 を計算します。 # 小数点がつくと自動的に実数として処理します。 # set ninzuu 0 set goukei 0. set jijowa 0. set heikin 0. set sigma 0. # 初期化 ボタンです。 button .bt1 -fg blue -bg yellow -text 初期化 -command { set tensuu1 0. set ninzuu 0 set goukei 0. set jijowa 0. set heikin 0. set sigma 0. } # # 点数の入力 entry 窓を作ります。.e1 は名前です。 # -width 10 半角10文字 -bg 背景色 -fg 文字色 # -textvariable moji 変数文字に結果が入ります。 # entry .e1 -width 10 -bg white -fg blue -textvariable tensuu # # bind コマンド 窓 .e1 上での 改行と { ... } # 結合します。 # bind .e1 { set ninzuu [ expr $ninzuu + 1 ] set goukei [ expr $goukei + $tensuu ] # pow(a,b) a の b 乗 です。a^b や a**b は使えません。 set jijowa [ expr $jijowa + pow($tensuu,2) ] set heikin [ expr $goukei / $ninzuu. ] set sigma [ expr sqrt( $jijowa/$ninzuu - $heikin*$heikin ) ] set tensuu1 $tensuu set tensuu "" } # # いろいろな label を作ります。-relief 形 です。 # label .lb1 -text 点数の入力 -bg white -fg blue label .lb15 -text 直前の点数 -bg white -fg orange label .lb16 -textvariable tensuu1 -relief groove -bg white -fg blue label .lb2 -text 現在までの人数 -bg white -fg black label .lb25 -textvariable ninzuu -relief ridge -bg white -fg blue label .lb3 -text 平均点 -bg white -fg black label .lb35 -textvariable heikin -relief raised -bg white -fg blue label .lb4 -text 標準偏差 -bg white -fg black label .lb45 -textvariable sigma -relief solid -bg white -fg blue # # pack ボタン .b1 を詰めて表示する。これがないと表示しない。 # # -fill both ( x 方向にも y 方向にも 詰めて配置) # pack .lb1 .e1 .lb15 .lb16 .lb2 .lb25 .lb3 \ .lb35 .lb4 .lb45 .bt1 -fill both -expand yes
点数を入力するには、入力窓に マウスを移動しクリックする 必要があります。
改行で入力です。これは bind で Return key と command を つないでいます。すでに勉強しました。
少し長い例ですが、実行してみますと 平均点と標準偏差が その都度計算されます。直前の点数をいれたのは、どこまで入力し たかを忘れないためです。
label の -relief で 表示窓の形式が変わります。default は -relief flat です。
#!/bin/sh # the next line restarts using wish \ exec wish "$0" "$@" # siki.tcl # 初期化 ボタンです。 button .bt1 -fg blue -bg yellow -text 初期化 -command { set siki "" set kekka "" } # # 点数の入力 entry 窓を作ります。.e1 は名前です。 # -width 10 半角10文字 -bg 背景色 -fg 文字色 # -textvariable moji 変数文字に結果が入ります。 # entry .e1 -width 10 -bg white -fg blue -textvariable siki # # bind コマンド 窓 .e1 上での 改行と { ... } # 結合します。 # bind .e1 { set kekka [ expr $siki ] } # # 実行ボタンでも 実行できることにします。 # button .bt2 -text 実行 -fg red -bg white -command { set kekka [ expr $siki ] } button .bt3 -text 終了 -fg blue -bg white -command exit # # いろいろな label を作ります。-relief 形 です。 # label .lb0 -text 計算式 -width 30 -bg white -fg black label .lb1 -text 計算結果 -bg white -fg black label .lb2 -textvariable kekka -relief solid -bg white -fg blue # # pack ボタン .b1 を詰めて表示する。これがないと表示しない。 # pack .lb0 .e1 .bt2 .lb1 .lb2 .bt1 .bt3 -fill both -expand yes
先程より短いですが、まずは上を実行して見てください。 計算式に、たとえば (3+4)*8 を入力し、実行ボタンを押します。 また pow(2,10) や exp(1.0) を入力してみてください。
初期化を押さなければ計算式を修正して、再度実行が出来ます。 通常の電卓より便利だと思います。ポケコンはこういう感じだと思 います。
tcl を利用した電卓はいくらでも自分の好きなように作ること ができます。mocalc などは tcl/tk で作られた電卓です。Linux などの package にありますので、ftp 検索で探してみてください。
#!/bin/sh # the next line restarts using wish \ exec wish "$0" "$@" # program.tcl # プログラム入力 text 窓を作ります。.txt1 は名前です。 # -width 10 半角10文字 -bg 背景色 -fg 文字色 # text .txt1 -width 30 -bg white -fg blue # # 実行ボタンで 実行します。 # button .bt2 -text 実行 -fg red -bg white -command { set contents [ .txt1 get 1.0 end ] eval $contents } button .bt3 -text 終了 -fg blue -bg white -command exit # # いろいろな label を作ります。-relief 形 です。 # label .lb1 -text "計算結果 = \$kekka" -bg white -fg black label .lb2 -textvariable kekka -relief solid -bg white -fg blue # # pack ボタン .b1 を詰めて表示する。これがないと表示しない。 # pack .txt1 .bt2 .lb1 .lb2 .bt3 -fill both -expand yes # # set a 1 ; set kekka [ expr $a + 5 ] #
実行してみましょう。大きな入力空間ができます。 そこに 下の tcl の プログラムを マウスで copy して見てくださ い。そして実行 ボタンを押すと 実行結果に $kekka の値 が表示 されます。
set x 1 set y 10 set z [ expr $x + $y ] set kekka $zいろいろな 変数を set したり、複雑な計算ができます。 結果は set kekka で kekka にいれれば 実行されます。
実行は、text の 内容を contents にいれます。get コマンド を利用しています。そして contents の中身を eval コマンドで実 行しています。これも逐次に解釈する インタープリターの性質を うまく利用しています。これで tcl のプログラムを check するこ ともできます。ただし error が分かりにくいと思いますので、文 法を見たいのであれば、% wish を起動してそこの プロンプトで実 行するほうが実際には便利でしょう。プログラムを直しながら何度 でも実行できるのがここの味噌です。初期化ボタンはその意味で作 りませんでした。必要なら マウスで editor に copy します。 file に save するのには menu command を勉強する必要がありま す。
rsaito@ee.uec.ac.jp