Tcl/Tk GUI プログラミング入門
Tcl/Tk を使って GUI(グラフィック・ユーザー・インターフェース)を作ろう。
Tcl 言語の文法のキーポイントと Tk ライブラリーによ GUI プログラミン
グの概要について手短に説明する。例はすべ UNIX コンピューターで実行
可能であるから、実際に試しながら読むとよい。
Tcl という言語は C Fortran のような普通のプログラミング言語とは非常
に異なり UNIX のシェルである tcsh bash に似ている。Tcl 文はすべて
命令語 パラメータ パラメーター ...
という形式であり、Tcl のインタープリターは基本的な文字列操作を行ってか
ら命令を呼び出すという処理を繰り返す。データは文字列しか無いが、文字列
で複雑な構造を扱うことができるようにするために「リスト」の概念がある。
Tcl には C言語などを使って拡張機能を組み込むことができる。Tk はそういう
拡張機能の一つであり、GUI を容易に構成するための高機能命令群を提供して
いる。Tk GUI 築ツールの元祖的存在であり、GUI プログラミングのエッ
センスがすべて入っている。Tk を組み込んだ形の Tcl Tcl/Tk 呼ぶ。通
常、Tcl 「ティクル」と読み、Tk は「ティーケー」と読む。
Tcl/Tk のメインサイトは
http://www.tcl.tk/
である。日本語の資料としては、
詳解 Tcl/Tk GUI プログラミング: 須栗歩人, 2000 , 秀和システム
が役立つ。
Tcl/Tk インタープリターは tcltk などという名前ではなく wish いう。
"Windowing shell" ということらしい。以後しばらく、wish プログラムの
での対話の様子を使って説明を行なおう。UNIX wish プログラムを起動す
るには、kterm のような端末ウィンドウで wish と打てばよい。
起動するとプロンプトとしてたぶん % が表示される。この状態でコマンドを
入力して結果が表示されるのを見るという繰り返しを行なうwish の起動と
同時に中身の無いウィンドウが現れるかもしれないが、ボタンのよう GUI
部品はここに表示される
--------------------------------------------------------
目次
1. Tcl 言語の基本構
1-1 コマンド
1-2 変数置換
1-3 命令置換
1-4 文字列
1-5 リスト
1-6 関数
1-7 制御命令
1-8 行の継続
2. Tcl スクリプト
2-1 スクリプトの作
2-3 スクリプトの例
3. GUI
3-1 ウィジットの種
3-2 ウィジットの作
3-3 複数ウィジットの配置
3-4 ウィジットコマンド
3-5 外部コマンドを呼びだす
3-6 -textvariable オプション
3-7 練習
4. Visual Tcl
--------------------------------------------------------
1. Tcl 言語の基本構
Tcl プログラムは以下のような少数の基本構造からなる
1-1 コマンド
Tcl プログラムは「命令」からなる。各命令は下のように命令語とパラメーター
を順に並べて作られる。
命令語 パラメータ 1 ラメータ2 ...
命令語やパラメーターの間はスペースで区切られる。パラメーターの数や意味
は命令によって異なる(パラメーターをとらない命令もあ)
% puts abcdefg
abcdefg
% expr 1 + 4 / 2
3
% expr sin(3.14)
0.00159265291649
puts 命令は与えられた文字列 "abcdefg" を表示した。次に expr 命令は全パ
ラメーターを集めて式として計算しその結果を返した。三角関数の計算もでき
た。
Tcl コマンドの多くには man ページがあるUNIX シェルで
apropos tcl
とやると、Tcl コマンドとその man ページのセクションのリストが表示され
る。同じ名前の UNIX コマンドがあることが多いので、各コマンドの man ペー
ジを表示するには、次のようにセクションを指定する必要があるかもしれない。
man n expr
1-2 変数置換
Tcl は実際にはコマンドを実行する前に与えられた文字列を調べる。このとき、
ある規則にしたがって文字列の置き換えを行う場合がある。「変数置換」はそ
の一つである。変数を使って文字列を記憶して名前を付けておくことができる。
% set a ABCDEFG
ABCDEFG
% puts $a
ABCDEFG
% puts abc${a}defg
abcABCDEFGdefg
% puts abc$adefg
can't read "adefg": no such variable
a という変数を使い、それに "ABCDEFG" という文字列を代入した(ここではま
だ空白を含む文字列は扱わない)set 命令はその結果として "ABCDEFG" を返
した。次に puts 命令で変数 a の値を表示した。変数の値を取り出すために
はドルマークを変数名に付ける。これは UNIX シェルや Perl 言語と同様であ
る。この仕組みを変数置換と呼ぶ。次に変数の内容を文字列の中に挿入して表
示した。挿入するには大括弧で変数名を囲んでおく必要がある。次に大括弧で
囲むのを忘れたところ、a ではなく adefg が変数名とみなされ、そういう変
数は無いのでエラーになった。
1-3 命令置
角括弧[]を使って命令の中に他の命令を含ませることができる。その場合、角
括弧の中身が命令とみなされて実行された後、その結果を使って本体の命令が
実行される。これを命令置換という
% set a [expr 5 + 7]
12
% puts $a
12
括弧の中の "expr 5 + 7" がまず実行されてからその結果であ 12 使って
結局 "set a 12" いう命令が実行された。変数 a に計算結果 12 が入って
いることが確かめられた
1-4 文字列
空白を含まない文字の並びは一つの文字列になるが、空白が入るとそこで区切
られて、複数の文字列になる。しかし、クォーテーションマークで囲むと中に
空白があっても全体で一つの文字列になる。
% set x abc dfg
wrong # args: should be "set varName ?newValue?"
% set x "abc def"
abc def
% puts "abcd $a efg"
abcd ABCDEFG efg
スペースを含む文字列を変数に代入するつもりが、二つの文字列を指定したと
みなされてエラーになった。しかしクォーテーションマークで囲んだところう
まくいった。次にクォーテーションマークで囲まれた文字列の中に変数置換を
挿入して表示してみた。スペースまでが変数名とみなされ、大括弧は不要であっ
た。
大括弧{}で囲むことによっても一つの文字列ができるが、クォーテーションマー
クと同じではない。
% puts {abc def ghj}
abc def ghj
% puts {abcd $a efg}
abcd $a efg
% puts {"a string with quotes"}
"a string with quotes"
% puts {[expr 1 + 2]}
[expr 1 + 2]
スペースを含む文字列を大括弧で指定した。大括弧の中では変数置換は行われ
ず、$a がそのまま文字列の一部になった。クォーテーションマークや命令置
換の括弧 [] も本来の働きを失い文字列の一部になった
1-5 リスト
Tcl では、文字列をその中にある空白で区切って分解して単語の集まりのよう
に考え、これをリストという。たとえば、"123 4567" という文字列は 2つの要
"123" "4567" からなるリストである。リストの要素の数を数えるコマ
ンド llength を使ってみよう。
% llength "abc def"
2
% llength {abc def}
2
文字列 "abc def" 2つの要素からなるリストと解釈された。大括弧で文字列
を作っても同じであった
リストの中に要素としてリストを入れることができる。
% set x {123 {456 789}}
123 {456 789}
% llength $x
2
% lindex $x 0
123
% lindex $x 1
456 789
リスト内の要素を取り出すために lindex 令を使った。リストの最初の要素
の番号はゼロである。2番目の要素はリストであることが確認された。
Tcl コマンドをリストとして変数の中に収めておいて、後でそれを実行するこ
とができる。それには eval マンドを使う
% set ennya {puts "Ennyara koraya!"}
puts "Ennyara koraya!"
% lindex $ennya 0
puts
% eval $ennya
Ennyara korasa!
eval を省くと次のようにエラーになる。
% $ennya
invalid command name "puts "Ennyara koraya!""
変数の中身の文字列は一まとまりの単語のように扱われているのがわかる。と
いうことは、eval は与えられた文字列を解きほぐす働きがある。
1-6 関数
新しく関数(命令)を定義するに proc 命令を使う。命令の名前、仮引数リス
ト、 処理内容のリストを順に指定する。仮引数名は当該の関数定義の中で
み有効なので適当に付けてよい。引数の値を使用するには、変数と同様にドル
マークを使う。
% proc add {x y} {expr $x + $y}
% add 1 2
3
2つの引数をとってそれらの足し算を行なう関数 add を定義して使ってみた。
ここで注意しなければならないのはproc は関数名、引数リストおよび処理
内容という 3のパラメーターをとる命令であるということである。命令やパ
ラメーターの間は空白で区切られている必要があるが、このことは proc 命令
にもあてはまる。したがって、関数名と引数リストの間、および引数リストと
処理内容リストの間には空白を入れる必要がある。これを怠ると、次のように
わけのわからないエラーになるので、特に注意すること。
% proc add{x y} {expr $x + $y}
% add 1 2
error while autoloading "add\{x": too many nested calls
to Tcl_EvalObj (infinite loop?)
1-7 制御命令
条件分岐には if コマンドをよく使う。
% proc gcd {x y} {if {$x > 0} {gcd [expr $y % $x] $x} {return $y}}
% gcd 3435 45
15
gcd という関数の定義の中で if マンドを使って引数 x の値が正かどうか
によって異なる処理を行なうようにた。if 3つの引数をとる。条件式、真
の場合に実行されるコマンド、及び偽の場合に実行されるコマンドである。通
常、これらはそれぞれ大括弧で括っておく。
繰り返しを行なう命令に while などがある
% set y 1; set x 1; while {[incr x] <= 4} {set y [expr $y * $x]}
% puts $y
24
while コマンドは 2の引数をとる。繰り返しの条件と繰り返されるコマンド
である。これらもそれぞれ大括弧で括っておく。なお、incr という命令は指
定した変数に入っている(数値)1だけ増やしその結果を返す。
1-8 行の継続
Tcl ではひとつのコマンドは 1行の中に収まる必要がある。しかし、複雑なコ
マンドを読みやすくするために複数行に分けて書きたくなることもある。そう
いう場合のために、行末にバックスラッシュ \ を置くとその直後の改行は無
視されるようになっている。
% expr 1 +
syntax error in expression "1 +"
% expr 1 +\
2
3
まず、式の途中で改行したところエラーになった。次に、式の途中でバックス
ラッシュを置いてから改行し続けて数値を入力したところ、正常に計算が行な
われた。
クォーテーションマークや大括弧で囲まれた文字列の途中での改行はその文字
列の一部とみなされ、命令の終了とはみなされない。この場合にはバックスラッ
シュを使わない
% proc add {x y} {
expr $x + $y
}
% add 2 5
7
関数定義の処理内容を複数行に分けて書いてみた。大括弧の中では改行がその
まま記憶されるだけで、proc 令の終了とはならない。閉じ大括弧まで入
するとプロンプ % があらわれた。
なお、1行に複数の命令を書くには、命令の間をセミコロンで区切る
2. Tcl スクリプト
2-1 スクリプトの作
コマンドを並べて書いてファイルに保存すればスクリプトができる。その 1
目に #! 続けて wish コマンドの実行ファイルのフルパスを書いておき、さ
らにスクリプトファイルに実行権を与えると、スクリプトファイルを指定する
だけで wish がスクリプトを実行してくれる。これは UNIX シェルスクリプ
トで行われるのと同じ方法。UNIX では他のスクリプト言語でもこの方法が使
える。後で例が出てくる
スクリプトで Tcl マンドの結果の値を表示するには puts コマンドを使う
必要がある。
2-2 コマンドラインパラメーターとリザルトコー
コマンドライン Tcl スクリプトファイルを指定して実行する際、コマンド
ラインパラメーターを付けることもできる。コマンドラインパラメーターは
スクリプト中で argv という変数から読み込むことができる。
スクリプトは exit 令で終了する。exit 命令に指定された整数値は UNIX
シェルにリザルトコードとして伝達される。ただし、スクリプトのどこかでエ
ラーが起きるとそこで実行は中断し、ゼロでないリザルトコードが返される。
2-3 スクリプトの例
#!/usr/bin/wish
puts "Parameters: $argv"
puts "Result: [expr $argv]"
exit 0
上のスクリプト siki という名前のファイルとして保存する。最初の行はファ
イルの 1行目に置かなければならない。また1行目の左端から書き始めなけれ
ばこの行は無視されてしまうので注意。
UNIX シェルか
chmod +x siki
で実行権を設定する。UNIX シェルから
./siki 12 + 24 / 2
./siki sin\(3.14\)
./siki 'sin(3.14)'
./siki "sin(3.14)"
のようにして実行することができる。括弧はそのままではシェルで特別な記号
として扱われるので、それを防ぐために一つ一つの括弧の前にバックスラッシュ
を付けるか、式全体をクォーテーションマークで囲む。
スクリプトの実行の直後 UNIX シェルでリザルトコードを調べるには次のよ
うにやる。
echo $?
3. GUI
Tcl/Tk には GUI(ラフィカル・ユーザー・インターフェース) を作るための
機能が組み込まれている。この部分 "Tk" (Tool kit) という
ウィンドウ、ボタン、テキスト表示窓、スイッチ、スライダーのよう GUI
部品のことをウィジット(widget)という。ウィンドウは X画面上に単独で
置され「トップレベル」と呼ばれる。その他のウィジットはウィンドウや他の
ウィジットの中に配置され、トップレベルを始点とする階層構造をなす。
ウィジットの機能としては、情報を表示する機能や情報を入力する機能がある。
ウィジットになんらかの機能を持ったプログラムを結合し、たとえばボタンを
クリックすると何かが起こるようにすることもできる。これはよく「コールバッ
ク」と呼ばれる
3-1 ウィジット
よく使われるウィジットの種類には次のようなものがある。
toplevel - トップレベルのウィンドウ
frame - 複数のウィジットを包む見えない枠
button - プッシュボタ
label - 文字列を表示する領域
entry - 文字列を入力する領域
text - 複数行に渡る文字列を入力する領域
後で述べるように、これらの種類名はウィジットを作って初期化するコマンド
のコマンド名でもある。
一つ一つのウィジットを識別するには、トップレベルウィンドウからそのウィ
ジットに至る全階層を記述する。たとえば、 top1 という名前のトップレベル
ウィンドウの中 frame1 という枠を作ってその中に button1 という名前の
プッシュボタンを入れた場合、そのボタンは
top1.frame1.button1
と書いて指定する。このような文字列をウィジットの「パス」という
wish ではあらかじめ一つのトップレベルウィンドウが自動的に作られて用意
されていてこれには名前が無い。そこに frame1 という枠を作ってその中
button1 いう名前のプッシュボタンを配置するなら、そのボタンのパスは次
のようになる。
.frame1.button1
ウィジットの大きさや色や表示文字のような状態のことをここでは「プロパ
ティー」と呼ぶ。各ウィジットはそれぞれのプロパティーを保持する。ウィジッ
トの種類が違うと、持つことができるプロパティーも違うが、どの種類のウィ
ジットにも共通なプロパティーもある。
ウィジットは非常に多くのプロパティーを持っている。ウィジットの作成時に
自動的に適当な既定値がセットされるが、ウィジットの作成時や作成後に必要
に応じて個々のウィジットのプロパティーを明示的に変更することもできる。
3-2 ウィジットの作
ウィジットを作るにはたとえばつぎのようにする(ただしこの段階ではまだ
面上には現れな)
% button .b1 -text "hello" -command exit
.b1
名無しのトップレベルウィンドウの中に b1 という名のプッシュボタンを生成
した。その表面の文字は hello である。また、ボタンをクリックすると exit
コマンドを実行するように設定した。これらはこのボタンのプロパティーであ
る。プロパティーを指定するために-text "hello" -command exit のよ
うな「オプション」を使っている。
ウィジットを実際に表示するには、表示する位置を決めるため「配置」を行な
う必要がある。よく使われる配置コマンドは pack コマンドである。ウィジッ
トの位置を半自動的に調整してくれるので楽ができる。上で定義したボタンを
配置するには、
% pack .b1
とやる。これでボタンが表示される。それをクリックすると wish が終了しボ
タンも消える。これはあらかじめこのボタン command プロパティーに exit
を指定していたからである。
ボタンの command プロパティーの内容をあらわすのに複数の単語が必要な場
合は、次のようにそれらを大括弧の中に入れる。
% button .b1 -text "Hello" -command {puts "Bye!"; exit 0}
.b1
% pack .b1
ここでセミコロンは命令の区切りの意味である。次のように複数行に分けて書
くこともできる。行を変えるとセミコロンはいらない。
% button .b2 -text "Goodbye" -command {
puts "See you!"
exit 0
}
.b2
% pack .b2
もっと複雑な作業が必要なら、それを行なう関数を定義して -command オプシ
ンにはその関数を実行するように指定する方がよい。
ウィジットの種類によってどのようなプロパティーを持つかは異なるから、使
用可能なオプションもウィジットの種類によって異なる。これは man ページ
で調べるのが手っ取り早い。ウィジットの種類に特有のオプションを調べるに
は、シェルで
man n button
のようにと打ってウィジットの man ページを表示すればよい。 だし、多く
のウィジットに共通なオプションについてはoptions という
man ページにまとめてある。
man n options
3-3 複数ウィジットの配置
何も考えない場合はウィジットは pack コマンドで指定した順に上から配置さ
れる。
% label .lab1 -text "Full name?"
.lab1
% button .b1 -text "YMCA" -command {
puts "Young Men's Christian Assosiation" }
.b1
% button .b2 -text "YMO" -command { puts "Yellow Magic Orchestra" }
.b2
% button .b3 -text "WTO" -command { puts "World Trade Organization" }
.b3
% button .b4 -text "EXIT" -command exit
.b4
% pack .lab1 .b1 .b2 .b3 .b4
"Full name?" という文字列と 4つのボタンを配置してみた。最後のボタンは終
了ボタンであるpack コマンドにオプション -side left 付けると、ウィ
ジットは横に並ぶ。
一部だけを横に並べたい場合は、frame ウィジットを作り、横に並べるウィジッ
トをその中に配置する。
% label .lab1 -text "Full name?"
.lab1
% frame .buttons
.buttons
% button .buttons.b1 -text "YMCA" -command {
puts "Young Men's Christian Assosiation" }
.buttons.b1
% button .buttons.b2 -text "YMO" -command {
puts "Yellow Magic Orchestra" }
.buttons.b2
% button .buttons.b3 -text "WTO" -command {
puts "World Trade Organization" }
.buttons.b3
% button .b4 -text "EXIT" -command exit -fill x
.b4
% pack .buttons.b1 .buttons.b2 .buttons.b3 -side left -padx 10
% pack .lab1 .buttons .b4 -pady 10 -fill x
.buttons という frame ウィジットの中に 3のボタンを配置した。横に並べ
るために、オプション "-side left" 使った。また、間隔を空けるために
"-padx 10"というオプションを使った。さらに label ウィジット .lab1
frame ウィジット .buttons button ウィジット .b4 縦に並べた。縦方
向の間隔を空けるために"-pady 10"というオプションを使った。"-fill x"
を使うと、各ウィジットの横幅を伸ばして揃えることができる。-fillx では
ない。
3-4 ウィジットコマンド
生成済みのウィジットに対して指示を与えてプロパティーを変更したりするこ
とができる。そのような指示をウィジットコマンドという。ウィジットのプロ
パティーを変更するウィジットコマンド、configure を試してみよう。
% button .white -text White -command { . configure -bg white }
.white
% button .black -text Black -command { . configure -bg black }
.black
% button .exit -text EXIT -command { exit 0 }
.exit
% pack .white .black .exit -padx 10 -pady 10
White ボタン Black ボタンを押すとトップレベルウィンドウに対して
configure コマンドが実行され背景色が変わるようにした。名無しのトップレ
ベルウィンドウはドット . あらわす。その背景色を指定するには -bg オプ
ションを使う。背景色を見るにはボタンのまわりが空いていなければならない
ので、オプショ -padx -pady を使った。
文字列を入力するために entry ウィジットを使う場合は、ウィジットコマ
get で入力データを読み込むことができる。
% entry .e -width 20 -bg white
.e
% button .b -text OK -command {puts [.e get]}
.b
% button .exit -text EXIT -command {exit 0}
.exit
% pack .e .b .exit -side left -padx 5
文字列を入力してから OK ボタンを押すと読み込んで表示するようにした。ウィ
ジットコマンドを実行した結果を表示するので、命令置換の形式を使う必要が
ある。
label ウィジットの表示内容を変えるにはウィジットコマンド configure
オプション -text 使う。entry ウィジットに入力した内容を label ウィジ
トにそのまま表示するようにしてみよう。
% label .v -width 20 -bg yellow
.v
% button .bb -text Copy -command { .v configure -text [ .e get ] }
.bb
% pack .v .bb -side left -padx 5
3-5 外部コマンドを呼びだす
以下では wish 中での対話ではなくスクリプトとしてまとめたものを例として
示す。これらを試すには、適当な名前のファイルに保存して実行権を設定して
から実行する。
Tcl/Tk で作った GUI でデータを入力して 他の UNIX マンドのコマンドラ
インに与えるとGUI を持たないプログラムに簡単に GUI を追加することが
できる。
UNIX cal コマンドにはコマンドラインパラメーターとして月と年を与える
が、それを Tcl/Tk で作った GUI で与えるようにしてみよう。cal コマンド
Tcl/Tk プログラムの中から呼び出す。
#! /usr/bin/wish
frame .month
label .month.l -text "Month" -width 6
entry .month.e
pack .month.l .month.e -side left
frame .year
label .year.l -text "Year" -width 6
entry .year.e
pack .year.l .year.e -side left
button .ok -text OK -command show
pack .month .year .ok -pady 5
proc show {} {
set command "exec cal [.month.e get] [.year.e get]"
# puts "command: $command"
puts [eval $command]
}
月と年を入力してから OK ボタンを押すと show という関数が実行されカレン
ダーの表示が行なわれるようにした exec コマンドによって外部コマンドを
実行することができるがexec マンドの全体をあらかじめ組み立てて
command いう変数に置いてから、その中身を eval で実行した。cal コマン
ドの出力は eval の結果になるので、それを puts 表示している。一度全部
をまとめて変数に入れておけば、その内容を表示してチェックすることできる
ので安全である
入力ボックスでリターンキーを押すとカレンダーが表示されるようにするには、
下のように入力ボックスに対して bind コマンドで設定を行なう
#! /usr/bin/wish
frame .month
label .month.l -text "Month" -width 6
entry .month.e
bind .month.e <Return> show
pack .month.l .month.e -side left
frame .year
label .year.l -text "Year" -width 6
entry .year.e
bind .year.e <Return> show
pack .year.l .year.e -side left
button .ok -text OK -command show
pack .month .year .ok -pady 5
proc show {} {
set command "exec cal [.month.e get] [.year.e get]"
puts [eval $command]
}
これで、月や年を入力し終った時点でリターンキーを押すとカレンダーが表示
される。bind コマンドで指定した <Return> は「イベント」という。入力ボ
クス以外のウィジットに bind でキー入力イベントを関係付けることができ
る。
3-6 -textvariable オプション
入力ボックスなどから入力文字列を得たり文字列を表示したりするにはウィジッ
トコマンド get configure を使えばよかったが、同じ目的
-textvariable というオプションを使うこともできる。
このオプションはウィジットに変数を関係付け、ウィジットの表示内容と指定
した変数の値が常に連動するように設定する。ウィジットの生成時にこのオプ
ションを使って初期設定を行うだけで後は自動的に処理されるので便利である。
複数のウィジットに同じ変数を関係付けることによって、ウィジットの表示内
容どうしが同期して変化するようにすることもできる。
entry .month.e -textvariable MONTH
のように関係付ける変数名を指定する。以後、変数置換 $MONTH でこの入力ボッ
クスの内容を得ることができるし、代入 set MONTH .... で入力ボックスの内
容を変えることができる
3-7 練習
上の GUI EXIT ボタンを追加してみなさい。また、入力ボックスの背景色
を白にしてみよう。また、年の欄に既定 2002 があらかじめ入るようにす
るにはどんなウィジットコマンドが必要か調べてみよう
上のプログラムで -textvariable プションを使い、ウィジットコマンドを
変数置換や代入に置き換えて見なさい。
4. Visual Tcl
Visual Tcl では Tk GUI ログラムを視覚的操作を使って自動的に作る
とができる。ウィジットはマウスの操作で配置し、プロパティーは一覧表を使っ
て設定する。 コールバックや関数定義を付け加えてセーブするとTcl/Tk
実行可能なスクリプトができる。製作途中のものを Visual Tcl の内部から実
行してテストすることもできる。
はじめて使うときは、使用するウィジットのライブラリーの設定を行なう必要
がある。それには、ホームディレクトリーに .tcllibs というファイルを作り、
lib_core.tcl
と書いておく。あるいはVisual Tcl を起動するとはじめに設定プログラム
が起動するようになっているかもしれないが、この場合も lib_core.tcl を必
ず選ぶ。
Visual Tcl の起動はkterm vtcl と打つ
縦長のウィンドウにボタンが並んだのはツールバーというらしい。これの一番
上の左側のボタンでまずトップレベルウィンドウを作る。その中に他のウィジッ
トを配置していく。 ップレベルウィンドウを作ったらツールバーの "B"
書かれたボタンを押してボタンを作ってみよう。
横長のウィンドウの左端の欄でウィジットの文字列を編集することができる。
今作ったボタンの文字を "EXIT" に変えてみよう。このときボタンを選択して
いる状態でなければならない。
さらにすぐ右側 "..." と表示してあるボタンを押すとコールバックの編
ウィンドウがあらわれる。コールバックとして、
destroy .
と書き込もう。Visual Tcl 場合、ドット . はアプリケーション全体を意味
する。書いたら OK ボタンを押すこと。
次に、Mode メニューで Test モードにし、EXIT ボタンを押してみよう。vtcl
ごと終了すれ OK。ただし、今作ったものは保存していないのでパーになった。
このような全体を終了させてしまうコマンドをテストすると、保存されないま
まになるかもしれないので注意が必要。
もう一度 Visual Tcl を起動して EXIT ボタンを作り、今度はテストを行なう
前に保存する。File ニューから Save as... を選び、適当な名前を付けて
保存する。ファイル名に .tcl と付ける必要はない。たとえば、"simple"
いう名前で保存したら、kterm
./simple
と打つと、単独で実行される。
さて、Visual Tcl で、"Attribute Editor" というウィンドウがもし表示され
ていなければ、メニューの中の Window メニューから表示を行なってほしい。
これには選択されているウィジットのすべてのアトリビュートがあり、編集す
ることができる。ツールバーにあるいろいろなウィジットを配置し,色を変え
たりしてみよう
ボタンを配置してそれにコールバックとして他のウィジットの属性を変更する
機能を付けることは簡単であるので,練習としていろいろ試してみよう。ウィ
ジットの名前は Attribute Editor でわかる。その属性を変更するには,前に
出てきたようにウィジットコマンド configure を使う
Function List ウィンドウを開くと定義されている関数の一覧が表示される。
関数名をダブルクリックすると内容が表示されるが,空っぽでもかまわない。
自分で関数を定義するに Function List ウィンドウの Add タンを押す
定義した関数をコールバックとして指定することができる。
プログラムを保存してできたファイルを mule などで開き,
# USER DEFINED PROCEDURES
と書かれた行以降を見ると,Function List にある関数の定義が入っているの
がわかる。