最終更新日: Mon Jun 25 11:54:00 2001
このページは、江草が2000年度(平成12)にTAでTcl/Tkを教えたときの ドキュメントです。
ちょっとした、Tck/Tkのチュートリアルになるかもしれません。
2000年度(平成12) 授業名:情報処理演習II-2 対象学年 3年 2単位 前期 金曜日5時限、実習室 I Tcl/Tk ( 6/9,16)
Tcl/TkはGUIを簡単に実現できるスクリプト言語です。 作成したスクリプトはC言語のようにコンパイルしなくても、 そのまま実行できます。
実際にTcl/Tkの説明に入る前に幾つかの準備と、 約束事があります。
まず、以下のコマンドを実行してこの授業用のディレクトリを作成してください。
実行例1)dream% mkdir ~/tcltk
この授業では幾つかのスクリプトを作成します。 作成するスクリプトは全てこの~/tcltk/ ディレクトリの下に作成してください。
以下を入力してみましょう。
実行例2)dream% wish8.0jp
すると以下のような小さなウインドウが表示されます。
以下の2行を実行してみましょう。
% button .b -text こんにちは % pack .b
すると「こんにちは」というボタンが先ほどの小さなウインドウにできます。
このようにTcl/Tkではたった2行でボタンを作ることができます。
1行目の"button .b -text こんにちは" は ".b" というpathName(Tcl/Tkではこう呼ぶ)でこんにちは という ボタンの定義をしています。 2行目は ".b" を実際に配置しています。 あとで詳しく述べますが、Tcl/Tkではbuttonなどのことを widget(ウイジェット)といいいます。
ではこのこんにちは ボタンをクリックしてみて下さい。 しかし、何もおきません。
以下の2行を入力してみて下さい。
実行例4)% button .b2 -text おはよう -command bell % pack .b2
では「おはようボタン」をクリックしてみて下さい。 こんどはクリックすると音がなります。
1行目のおはようボタンの定義に"-command bell"があるので ボタンをクリックした時にベルがなります。 このように -command の後に実行することを記述することで ボタンをクリックした時にさまざまな動作を起こすことができます。終了するにはexitコマンドを使います。
実行例5)% exit
今までは、キーボードからコマンドを入力してボタンを 作成しましたが、毎回入力するのは面倒なので、 今度は、ファイルにコマンドを書いておいて、いちいち毎回キーボードから 入力しない方法を説明します。
まず、以下を入力したファイル"goodmorning.tcl"を作成して下さい。
スクリプト1)goodmorning.tcl#!/bin/sh # the next line restarts using wish \ exec wish8.0jp "$0" "$@" button .b2 -text おはよう -command bell pack .b2
次に以下のコマンドを実行して、goodmorning.tclファイルを コマンドとして実行できるように、実行パーミッションをつけます。
実行例6)dream% chmod u+x goodmorning.tcl
そして、以下のようにgoodmorning.tcl を実行してみてください。
実行例7)dream% goodmorning.tcl
すると、例2と同じ「おはようボタン」ができます。
以下を実行すると、いろんなwidgetのデモを見ることができます。 適当にリンクをたどって眺めてみてください。 "See Code" ボタンをクリックすると実際のスクリプトが みれます。
実行例8)dream% /opt/free/lib/tk8.0jp/demos/widget
先ほどのデモではかなり複雑なスクリプトでしたが、 参考文献にもあげている須栗さんの作成している Tk widgets のページではわかりやすいwidgetのサンプルがあるので参考になるでしょう。
このように様々なwidgetを使ってGUIを実現します。 授業では一つ一つのwidgetの使い方に付いては説明しませんが、 どのwidgetにもいえる基本事項やman ファイルの見方をbuttonを例に説明します。
まず、buttonのマニュアルの Synopsisを見てください。
となっています。 pathNameとはこれまでの例でいうと".b" ".b1"というような widget固有の名前です。 なお? ?で囲まれているのは省略可能ということを表します。
?options? には省略可能なオプションが入ります。 例でいうところとの -text とか、-commandなどです。
STANDARD OPTIONSには 他のwidgetでも共通のオプションが書いてあります。 -textなどがそれにあたります。 これらの使い方はoptionsのマニュアル や配布資料を見てください。
Widget-specific Optionsには そのwidget特有のオプションの使い方が書いてあります。 buttonの場合、-command などがそれにあたります。
いままでのおはようbuttonなどの例で、packという
コマンドを用いました。
このpackというコマンドは、
定義したwidgetを実際に配置するためのジオメトリ・マネージャーの
一つであるpackerのコマンドです。
他にもgridやplacerなどがあります。
参照:packのマニュアル
pack.tclは 3つのボタンをpackしたプログラムです。
スクリプト2:pack.tcl#!/bin/sh # the next line restarts using wish \ exec wish8.0jp "$0" "$@" # ウィンドウ・タイトルを button にする wm title . button # button widget を定義 button .b1 -text 1番目 -command bell button .b2 -text 2番目 -command bell button .b3 -text 3番目 -command bell # 配置マネージャpackerで3つのbutton widgetを.(master)上に配置 pack .b1 .b2 .b3
pack.tclをダウンロード(保存)して、 実行してみてください。
実行例9)dream% chmod u+x pack.tcl dream% pack.tcl
pack .b1 .b2 .b3 -side left
練習2)pack.tclの最終行のleftの部分をrightやbottomやtopに書き換えて、実行してみてください。
このようにpackはwidgetをいろんなふうに配置できます。 -side leftは widgetを左から順に配置するという意味です。 同様に、-side top はwidgetを上から順に配置するという意味になります。 -sideを指定しないと、-side topと同じになります。 他に良く使うオプションとしては、-fillと-expandがあります。pack .b1 .b2 .b3 -fill both -expand yes
すると、ウインドウのサイズを変えると、 ボタンの大きさが変わるようになります。
"-fill both" は ウインドウの大きさを変えたときに、widgetの左右上下方向に 引き延ばすという指定です。 -fill にはbothの他にも none,x,y などの指定があります。
"-expand yes" とはウインドウの大きさを変えたときに widgetが追随するかどうかです。-expandはyesの他にもno,1,0,true,falseがあります。
packを使うだけだと、単純な配置しかできません。 そこで、frame widgetを使うともっと複雑な配置ができるようになります。 frame widget は 名前どおりフレーム(枠)を 作るだけなので、他のwidgetとちがって、レイアウトを整えるのに使います。 例えばこのように使います。
スクリプト3:frame.tcl#!/bin/sh # the next line restarts using wish \ exec wish8.0jp "$0" "$@" # ウィンドウ・タイトルを "frame example" にする wm title . "frame example" frame .f1 button .f1.b1 -text 1番目 -command bell button .f1.b2 -text 2番目 -command bell # 配置マネージャpackerで .f1.b1 と .f1.b2 を .f1 に 上から順に配置 pack .f1.b1 .f1.b2 frame .f2 button .f2.b3 -text 3番目 -command bell button .f2.b4 -text 4番目 -command bell # 配置マネージャpackerで .f2.b3 .f2.b4 を .f2 に上から順に配置 pack .f2.b3 .f2.b4 # 配置マネージャpackerで .f1 .f2 を左から順に .(master)上に配置 pack .f1 .f2 -side left
frame.tclをダウンロード(保存)して、 実行してみてください。
実行例10)dream% chmod u+x frame.tcl dream% frame.tcl
補足:これは問題が悪かったようです。-text を書き換えたり、pathNameを書き換えたりした人を大勢みかけました。正しい問題としては 「frame.tclのpackの行のみを書き換えて、以下のような配置にしてください。」でした。
dream% tclsh8.0jp %
コメントアウトするには行の始めに#をつけます。 # をつけた行はすべてコメントアウトされます。
スクリプト4)#!/bin/sh # the next line restarts using wish \ exec wish8.0jp "$0" "$@" # この行はコメントアウトされています。 # button の定義 button .b2 -text おはよう -command bell pack .b2
標準出力はputsコマンドを使います。
実行例12)% puts 今日は晴れです。
スペースを含む文の場合、"でくくります。
実行例13)% puts "My name is Yuka Egusa."
"でくくったなかに"を使いたいときには、"の前に\を書きます。NEW !!
実行例14)% puts "My name is \"Yuka Egusa\"."
練習5)スクリプト1のgoodmorning.tclを おはようボタンをクリックすると、 「おはよう」と標準出力されるように書き換えなさい。
Tcl/Tkにおいて変数はすべて文字列としてあつかいます。 変数の代入にはsetを使います。
実行例14)% set my_value apple
これは my_value という変数に apple という 文字列を代入する という意味です。
変数の値を参照するにはputsを使います。 変数の値を表すには$をつけます。 $をつけないと文字列とみなされます。
実行例15)% puts $my_value
算術計算をするときにはexprを使います。
実行例16)% expr 2 * 3 % set a 4 % set b 5 % expr $a * $b
計算した結果を他の変数に代入するには以下のようにexpr全体を [ ]でくくります。
実行例17)% set c [expr $a * $b] % puts $c
#!/bin/sh # the next line restarts using wish \ exec wish8.0jp "$0" "$@" set entdata "" frame .f label .f.l -text 入力: entry .f.e -width 20 -relief sunken -textvariable entrydata pack .f.l .f.e -in .f -side left button .b_print -text 入力デ−タの標準出力 -command {puts $entrydata} button .b_popup -text ポップアップウインドウに出力 -command { toplevel .sub frame .sub.f label .sub.f.l -text $entrydata -relief ridge pack .sub.f.l -in .sub.f -side left button .sub.b_fin -text 閉じる -command {destroy .sub} pack .sub.f .sub.b_fin } button .b_fin -text 終了 -command exit pack .f .b_print .b_popup .b_fin
# --------------------------------------------------- # 情報処理演習II-2 (Tcl/Tk) # 課題:簡易widgetデモスクリプト # 学籍番号:2000604 # メインシステムのID:yuka # 氏名:江草由佳 # ---------------------------------------------------
dream% wish8.0jp -f ~g○○○/tcltk/report.tcl
レポートの体裁は以下のとおり。
注意!! 体裁が整っていない場合は、課題ができたとみなしません。
総合情報処理センター事務室の横にある 申請書類ボックスに、提出してください。
締切りは6月23日です。
report.tclを実際に動かしてみて、一通り動いたらOKということにします。
参考例) レポート課題の例(button の簡易widgetデモスクリプト)6/9の授業では練習4)の実行結果の画像をHTMLに張り付けて提出してもらいました。
画面ダンプをとる方法% xwd -frame > frame.xwd とした後に、とりたいウインドウクリックして、アクティブにすると、 アクティブにしたウインドウの画面ダンプがとれます。
% convert frame.xwd frame.gif
% identify frame.gif frame.gif 243x149+0+0 PseudoClass 32c 3850b GIF 1s
% display frame.gif
Error in startup script: unknown option " "
行の最後尾に余分なスペースがあるときに、 このようなエラーが出て実行できないことがあります。 行の最後尾には余分なスペースを書かないようにしましょう。