Wish Tcl/Tk 入門

Wish Tcl/Tk 入門

2.入力 と 出力

入力と出力はプログラムには必ず必要なものです。wish 上で 標準 入出力ではなく、window 上での入出力を説明します。

2.1 入力 と出力 (entry, label)

(実行例 1.1) 入力した文字を大きく表示します。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# io.tcl
# entry 入力窓を作ります。.e1 は名前です。
# -width 10 半角10文字 -bg 背景色 -fg 文字色
# -textvariable moji 変数文字に結果が入ります。
#
entry .e1 -width 10 -bg white -fg blue -textvariable moji
#
# label window に 文字を表示します。変数 moji が入出力用
# 
label .lb1 -textvariable moji -width 10 -fg red
#
# pack ボタン .b1 を詰めて表示する。これがないと表示しない。
#
# -fill both ( x 方向にも y 方向にも 詰めて配置)
#
pack .e1 .lb1 -fill both -expand yes

entry で入力した文字は、そのまま label に表示されます。 -textvariable で変数を定義すると、この変数がかわると同時に label の値を変更してくれます。

2.2 消費税計算

(実行例 1.1) 特定の計算をするための計算です。これは応用が広 い例題だと思います。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
# tax.tcl 2.2
#
# entry 入力窓を作ります。.e1 は名前です。
# -width 10 半角10文字 -bg 背景色 -fg 文字色
# -textvariable moji 変数文字に結果が入ります。
#
label .lb0 -text 税なしの価格 -justify center
entry .e1 -width 10 -bg white -fg blue -textvariable zeinasi
label .lb1 -text 税込みの価格
#
# 計算開始ボタンを作ります。expr = 演算せよ
#
button .bt1 -text 計算開始 -command {
set zeikomi [ expr $zeinasi*1.05 ]
}
#
# 入力窓 .e1上で改行(Return)しても計算開始ボタン
#               と同じ意味にできます。
# bind コマンド 窓 .e1 上での 改行  と { ... }
#               結合します。
#
bind .e1  { set zeikomi [ expr $zeinasi*1.05 ] }
#
# label window に 文字を表示します。変数 moji が入出力用
#
label .lb2 -textvariable zeikomi -width 10 -fg red
#
# pack ボタン .b1 を詰めて表示する。これがないと表示しない。
#       -fill both ( x 方向にも y 方向にも 詰めて配置)
#
pack .lb0 .e1 .bt1 .lb1 .lb2 -fill both -expand yes

少し長くなりましたが、まずは上を実行して見てください。 入力する所に、マウスを移動しクリックし 数字をいれます。

計算開始ボタンを押すと税込みの値が 赤い字ででます。 これは button .bt1 の -command 機能で行っています。

button を押すと、変数 zeikomi に 変数 zeinasi の値 $zeinasi を 1.05 倍します。[ expr ... ] が計算した結果を 返してくれます。数値計算の詳細は次の章で説明します。

またボタンを押すのがめんどくさく、入力窓で改行を押したら 同じ処理をする用に、bind コマンドで 改行 とコマンド をつなげておきました。この行をコメントにすると、改行をしても 何の実行がされません。

このように wish ではいまどこが実行されているのかは、 ボタンのコマンドであったり、bind で結合されたコマンドで あったり、上から順に処理されるプログラムとは少し違います。 でもこれは逆に、我々のプログラム上での判断をサボることができ ます。

2.3 Unix コマンドとの連結

(実行例 2.3) 入力を使って、unix command と組み合わせて見ましょ う。これも応用例がひろいです。
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
#
wm title . "tazunebito"
# finger.tcl 2.3
#
# entry 入力窓を作ります。.e1 は名前です。
# -width 10 半角10文字 -bg 背景色 -fg 文字色
# -textvariable hito 変数文字に結果が入ります。
#
label .lb0 -text 探したい人 -justify center
entry .e1 -width 10 -bg white -fg blue -textvariable hito
label .lb1 -text "探したい人の状況 (finger)"
#
# finger 実行ボタンを作ります。exec = Unix command 実行
#    注: exec は csh と異なり 子プロセスとして動きます。
#
button .bt1 -text finger -command {
set kekka [ exec finger $hito ]
}
#
# 入力窓 .e1上で改行(Return)してもfinger 実行ボタン
#               と同じ意味にできます。
# bind コマンド 窓 .e1 上での 改行  と { ... }
#               結合します。
#
bind .e1  { set kekka [ exec finger $hito ] }
#
# message window に 文字を表示します。変数 $kekka が入出力用
# (数行の文章の場合の表示には label でなく message を使います。)
#
message .me1 -textvariable kekka -width 500 -fg red
#
# pack ボタン .b1 を詰めて表示する。これがないと表示しない。
#       -fill both ( x 方向にも y 方向にも 詰めて配置)
#
pack .lb0 .e1 .bt1 .lb1 .me1 -fill both -expand yes 

2.2 と違うのは、unix コマンドである finger が使われてい ます。この結果が message window に $kekka として表示されてい ます。

message や label のように共通する option が いっぱいあり ます。どんな option が可能かは man message や man label を見 てみてください。調べなくても試してみれば ok です。kterm 上か ら % wish として、そこの wish prompt で いろいろ試すことが可 能です。

このほかの unix コマンドも試してみてください。file 入出 力をしたい場合には、file 入出力の 章を見てください。

説明不足は勘弁ください。理解するには、プログラムの実行が 不可欠です。また少し内容を変えて実行したりして見ると、だんだ ん理解できます。言語の学習では、似たような練習が必要です。


rsaito@ee.uec.ac.jp