#GUIを使う
基本的なコマンドの使い方の説明も飽きてきたので、GUIを使ってみよう。単純なアプリとして、次のようなものを作ってみる。
- ボタン1個のみからなる
- ボタンを押すと、押した時刻を標準出力に吐き出す
単純なものだが、こんなものでも使い道はあるだろう。
まずプログラムを見てみる。
proc printtime {} {
puts [clock format [clock seconds]]
}
button .b -text push -command printtime
pack .b
これを実行すると、次のようなボタンが現れる。
で、これを押すと、標準出力に次のような出力が出てくる。
Mon Apr 30 16:45:52 +0900 2018
Mon Apr 30 16:45:56 +0900 2018
#GUI部品を選んで表示
GUIを作るには、まず部品(widget)を選ぶ必要がある。これには次のような手順が必要だ。
- 必要な部品を選び、部品を生成する
- 生成した部品を配置する
##部品の生成
部品を生成するには、生成のためのコマンドを使う。ボタンを生成するのはbutton
コマンドである。
button 部品名 -text 表示文字列 -command 実行コマンド
部品の名前は . で始まり、適当な名前をつけることができる。今回のプログラムは
button .b -text push -command printtime
だったので、
- .b という名前のボタンを作る
- ボタンには push と表示
- ボタンが押された時には printtime というコマンドを実行
という指定であることが分かる。
この .b という名前は単なる名前ではなく、コマンドになっている。定義されたすべての部品はそれぞれ独自のコマンドになっていて、その部品を操作したり、情報を取得するために使う。これをウィジェットコマンドという。
##部品の配置
部品を生成しただけでは、部品は表示されず、使えるようにもならない。部品を使うためには配置しなければならない。
部品を配置するコマンドにはplace
, pack
, grid
の3つがある。place
は画面の指定した座標に部品を配置するが、柔軟性がないのであまり使わない。pack
は画面の端から指定した方向に部品を詰め込んでいく配置法である。また、grid
は画面を格子状に区切り、指定した区画に部品を詰め込む配置法である。簡単な配置にはpack
を、複雑な配置にはgrid
を使うのが良いだろう。
pack
は次のように使う。
pack 部品名... [-side 方向]
方向は top, bottom, left, right のいずれか。topにすると上から下へ、leftにすると左から右へ部品を詰める。画面に入りきらなくなると折り返す。
grid
の使い方はこんな感じ。
grid 部品名 -row 行番号 -column 列番号
行番号、列番号は0から始まる。
pack
,grid
いずれも多くのオプションがある。たとえば、画面をリサイズした時に部品の大きさは変わるのか、変わらない場合には区画のどちら側に寄るのか、などが指定できる。
#時刻の表示
GUIそのものとは関係ないが、時刻の表示についてもすこし説明する。
clock seconds
コマンドは現在の秒数を返すコマンドであり、clock format
コマンドはそれを時刻表示に変換するコマンドである。