タブセット

 タブセットとは、もう見たまんまのこんな感じのGUI部品です。

スクリーンショット

この「も」の部分を見て下さい。これがタブセットです (うそつけコラ) じゃなくて、画面上のタブをクリックすると、 そのタブに関連付けられたウィンドウが表面に出てくるという仕掛けのついたフレームの一種です。 このようなGUI部品をTcl/Tkで使えるようにする拡張は何種類かありますが、 BLTのタブセットも結構使いやすく、使える部品ではないかと思います。

#
# blt-tabset.tcl
# 2002/06/06 MISUMI URANO
# AM02:50 Tcl/Tk Scripting Laboratory
#
package require BLT
namespace import blt::*
namespace import -force blt::tile::*

wm title . "BLTのサンプル9 "
pack [set ta [tabset .ta]] -side top

$ta insert end tab1 -text "絵"
frame $ta.f1
set can [canvas $ta.f1.can -width 200 -height 200 -bg white]
bind $can <Button-1> { set sx %x; set sy %y }
bind $can <Button1-Motion> {
  set colorSpec [format "#%%02x%%02x%%02x" $Color(RED) $Color(GREEN) $Color(BLUE)]
  %W create line $sx $sy %x %y -fill $colorSpec -width $LineWidth
  set sx %x; set sy %y
}
pack $can
$ta tab configure tab1 -window $ta.f1

$ta insert end tab2 -text "線の設定"
set fa [frame $ta.f2]
set LineWidth 4
set scaa [scale $fa.scaa -from 1 -to 10 \
  -variable LineWidth -length 140 -ori h -label "線の幅"]
pack $scaa -side top -anc w
foreach e {red green blue} {
  set Color([string toupper $e]) 128
  set sca$e [scale $fa.sca$e -from 0 -to 255 \
    -variable Color([string toupper $e]) -ori h -label [string toupper $e]]
  pack [set sca$e] -side top -anc w
}
$ta tab configure tab2 -window $ta.f2

$ta insert end tab3 -text "ファイル"
set fa [frame $ta.f3]
set lm [label $fa.la -text "出力モード"]
set fm [frame $fa.fm -rel groove -bd 2]
set modeStrings {カラー グレー 二値}
set modes {color gray mono}
set OutputColorMode color
foreach e {0 1 2} {
  set r [radiobutton $fm.rad$e -variable OutputColorMode \
         -text [lindex $modeStrings $e] -value [lindex $modes $e]]
  pack $r -side left -padx 4
}
set lf [label $fa.lf -text "出力ファイル名"]
set ff [frame $fa.ff -rel groove -bd 2]
entry $ff.ea -width 30 -textvariable OutputFileName
button $ff.ba -text "参照..." -command {
  if {"[set a [tk_getSaveFile -title "出力ファイル名の指定"]]" != ""} {
    set OutputFileName $a
  }
}
pack $ff.ea $ff.ba -side left -padx 4
set b [button $fa.b -text "出力" -command {
  if {"$OutputFileName" == ""} {
    tk_messageBox -message "ファイルを指定して下さい。"
  } else {
    $can postscript -file $OutputFileName -colormode $OutputColorMode
    tk_messageBox -message \
"出力しました: $OutputFileName ([file size $OutputFileName]bytes)"
  }
}]
pack $lm $fm $lf $ff $b -side top -anc w
$ta tab configure tab3 -window $ta.f3

pack [set ba [button .ba -text "閉じる" -command exit]] \
 -padx 5 -pady 5 -anc e -side top

使い方は非常に簡単です。BLTのライブラリをロードしておき、 tabsetというコマンドで、 普通のTkウィジェットのように名前をつけて作成します。 tabsetのオプションは、frameコマンドのオプションによく似ていて、 -reliefや-borderwidth、-width などが指定できます。

pack [set ta [tabset .ta -relief groove -borderwidth 2]] -side top

次に、各タブをクリックしたときに表示されるGUIを作ります。 これはタブごとに、ひとつずつframeを作り、その中に各タブのGUI を載せていくとわかりやすいと思います。 ここで載せるframeなどのウィジェットは下のように、 必ずtabsetウィジェット(ここでは .ta) の子ウィジェットでないといけません。

frame .ta.f1
# ... 以下、GUI部品を載せていく
frame .ta.f2
# ... 以下、GUI部品を載せていく
# ...

各タブに表示されるGUIを作ったら、 タブとそれらのGUIを「関連付け」します。 これは下のように、tabsetウィジェットの insertサブコマンドを使って tabsetにタブを追加していき、 タブの見出し部分に表示されるテキストを-textオプションで、 タブのGUIの「底」になるウィジェットを-windowオプションで指定します。

$ta insert end tab1 -text "絵"
$ta tab configure tab1 -window $ta.f1

tab1やtab2というのは、各タブ固有の「名前」を好きなようにつけておきます。 tab configure サブコマンドを使うと、 このとき指定したtab1やtab2などのタブの「名前」 を指定して後から各タブを操作することができます。 これで、例えば「絵」というタブをクリックしたら、 フレーム .ta.tab1 に載っているGUIが表示されるようになります。 載っているGUIの操作は、もちろん普通のTcl/Tkと同じです。


ツリービュー

 BLTのバージョン2.4wからは、新しいウィジェット、 ツリービュー (treeview) が追加されました。 これは 2.4o から 2.4v まで存在していたハイアラキカルテーブル(hiertable) の完全上位互換で、 左半分がハイアラキカルリストボックスと同じツリー、 右半分がテーブル状の情報表示欄になっているものです。 右半分はワークシートみたいに直接キー入力で編集することはできないのですが、 それでもなかなか強力なウィジェットです。 2.4wでこのtreeviewが現れたことにより、 hierboxウィジェットとhiertableウィジェットは Obsolete(将来廃止予定)とされ、後方互換性のためだけに残されています。

package require BLT
namespace import blt::*
namespace import -force blt::tile::*

wm title . "BLTのサンプル(treeview)"
treeview .ta -separator / -width 400 -height 160
set paths {/kansai /kansai/kyoto /kansai/osaka 
           /kansai/osaka/yodogawa /kansai/kobe /chugoku}
set labels {関西支社 京都支店 大阪支店 淀川出張所 神戸支店 中国支社}
for {set i 0} {$i<6} {incr i} {
    set ids([lindex $paths $i]) \
      [.ta insert end [lindex $paths $i] \
       -label [lindex $labels $i] ]
}
.ta entry configure $ids(/chugoku) -foreground red

.ta column insert end "emps" -text 従業員数
.ta column insert end "equips" -text 設備台数
.ta column insert end "start_date" -text 開始年月
.ta entry configure $ids(/kansai/osaka) \
  -data {emps 45 equips 130 start_date 200010}
.ta selection set $ids(/kansai/kyoto)
.ta open $ids(/kansai)

bind .ta <Double-Button-1> {
    set id [%W curselection]
    set path [%W get -full $id]
    set label [%W entry cget $id -label]
    tk_messageBox -message "/$path ($label) がクリックされました。"
}
pack .ta
# end.

 ツリービューはtreeviewコマンドで作ります。 普通のTkウィジェットと同様、後ろにオプションをつけることができます。

treeview .ta -separator / -width 400 -height 160

リストボックスなどと同様、スクロールバーと組んで使うことも多いでしょう。 しかし、最も重要なオプションは-separatorで、 ツリーに表示する項目のツリー内での階層を表すパス (Path)の区切り文字を指定します。ここでは「/」を使っていますが、 「.」や「::」などもポピュラーです。

 ツリーに項目を追加するにはinsertサブコマンドを使います。 これはリストボックスのinsertコマンドとほぼ同様です。

set paths {/kansai /kansai/kyoto /kansai/osaka 
           /kansai/osaka/yodogawa /kansai/kobe /chugoku}
set labels {関西支社 京都支店 大阪支店 淀川出張所 神戸支店 中国支社}
for {set i 0} {$i<6} {incr i} {
    set ids([lindex $paths $i]) \
      [.ta insert end [lindex $paths $i] -label [lindex $labels $i] ]
}

endの位置には新しい項目を追加する位置を表す指示子を指定します。 endもそれらの指示子のひとつです。詳しくはマニュアルをご覧ください。 で、その後ろが「/kansai/osaka/yodogawa」のようなパスの指定で、 実際にツリーに表示される文字列は -label で指定します。 そして、このコマンドは整数のIDを返します。
 この他に-tagsオプションで複数の項目をグループにするためのタグも使えます。 この、「項目ID」「パス」「ラベルの文字列」「タグ」の区別に注意しましょう! この後各項目に対して何か処理をするときには、「項目ID」か「タグ」 を指定することになります。

 一度追加した項目に対して何か設定を変更するにはentry configureサブコマンドを使います。 例えば、パス「/chugoku」のラベルの色を赤に変更するには、

.ta entry configure $ids(/chugoku) -foreground red

とします。同様に値を取り出すには、entry cgetサブコマンドを使います。

set label [.ta entry cget $ids(/chugoku) -label]

 さあ、ここまでで左半分の説明をしてきました。 今度は右半分の説明をしないと右翼の皆さんに怒られてしまいます。(うるさいよ) 右半分を作るには、まずcolumn insertサブコマンドを使って、 列(カラム)を左から順番に追加していきます。 endの後ろの文字列は各列を一意に識別する列IDを適当に指定します。 その際に-textオプションで見出し文字列を指定できます。

.ta column insert end "emps" -text 従業員数
.ta column insert end "equips" -text 設備台数
.ta column insert end "start_date" -text 開始年月

 そして、各項目に対して、-dataオプションで表示したいデータを指定します。 そのデータは、「列ID」と「値」を対にして交互に並べたリストの形にします。

.ta entry configure $ids(/kansai/osaka) \
  -data {emps 45 equips 130 start_date 200010}

 これを各項目に繰り返せば、ツリービューの出来上がりです。 下は作りかけの絵ですが、気にしないでください。私は気にしません。(帰れ)

拡張レビュー分室 top
(first uploaded 1999/11/12 last updated 2002/06/07, MISUMI URANO - KAZUHISA ESHI)