BWidgetのツリーウィジェット

BWidgetにも、木構造を視覚的に表すツリーウィジェットがあります。

#
# treetest.tcl
# 2002/07/14

package require BWidget
wm title . "らぶみ"

set sv [ScrollView .sv -relief raised -bd 3]
set ta [Tree $sv.ta]
$ta configure -bg #cceeff -bd 3 -highlightcolor #808000 \
 -highlightbackground #eeeeff -selectforeground #008080 \
 -selectbackground #ffeeee
$ta bindText <Double-1> "doubleclicked $ta"

proc doubleclicked {ta nodei} {
  set text [$ta itemcget $nodei -text]
  set data [$ta itemcget $nodei -data]
  tk_messageBox -message "$text : $data"
}
$ta insert end root  node1 -text うらみ -data 1234
$ta insert end node1 node2 -text つらみ -data 1235
$ta insert end root  node3 -text ねたみ -data 1236
$ta insert end node3 node4 -text そねみ -data 1237
$ta insert end root  node5 -text しぶみ -data 1238
$ta insert end node5 node6 -text すごみ -data 1239
$ta insert end node6 node7 -text よわみ -data 1240

pack $sv; pack $ta
# end.

スクリーンショット

うらのみすみ、略して「うらみ」…(コロス)

 Treeがツリーウィジェットを作るコマンドです。 ツリーのノードを作るには、ウィジェットの insertサブコマンドを使います。

$ta insert end root  node1 -text うらみ -data 1234
3番目の引数は新しいノードの作成位置で、endは指定する親ノードにぶら下がっているノードの中で一番後ろ、 という意味になります。 4番目がその親ノードのノード識別子で、最上位につけたい場合には「root」 と指定します。 5番目は新しいノード自身のノード識別子で、上ではnode1、node2…と適当に振っていますが、 このように好きなように命名できます。 -textオプションはそのノードのラベルとして表示される文字列、 -data はその他、ノードに対して紐づけたいデータがあれば何かセットできます。

 ツリーのどれかのノードがクリックされたり、ダブルクリックされたりしたいときに、 何か処理をさせたい場合は、 bindTextサブコマンドを使います。 このコマンドは正確には、ノードのラベルの位置に対して何かのイベントが起こされた場合に、 反応するイベントハンドラを指定するもので、 これとは別にノードのアイコンに対して反応するイベントハンドラを指定する bindImage というサブコマンドもあります。

$ta bindText <Double-1> "doubleclicked $ta"

proc doubleclicked {ta nodei} {
  set text [$ta itemcget $nodei -text]
}
bindTextコマンドの使い方は上のようになります。3番目の引数が対象とするイベントで、 上の例は当然、マウス左のダブルクリックを示します。 4番目の引数がそのイベントが発生した時に実行されるイベントハンドラ=スクリプトで、 その最後には、このイベントが発生したときに選択されていたノードのノード記述子が自動的に付加されます (上のnodei)。 ノード記述子から-dataや-textオプションの値を取得するには、 itemcgetサブコマンドを使います。

 上のとは別に、スクリプト中で、現在選択されているノードのノード記述子を取得したい場合には、 select getサブコマンドが使えます。 また、ツリーの+ボタンがクリックされて親ノードが開いたときに、 何か処理をさせたい場合には、 Treeの-opencmdオプションにそのスクリプトを指定します。 (この場合も、開かれた親ノードのノード記述子が自動的にスクリプトのラストに付加されます)


矢印ボタン

 ArrowButtonウィジェットは、 ラベルとして矢印マークの画像がついたウィジェットです。 -typeオプションによってボタン風の表示と、スクロールバー風の表示を使い分けることができます。

スクリーンショット

package require BWidget

ArrowButton .ab1 -type button
ArrowButton .ab2 -type arrow
ArrowButton .ab3 -dir left -width 45 -height 45 \
  -fg #700040 -activeforeground red -armcommand bye

proc bye {} {
  tk_messageBox -title "終了します" -message "終了します。"
  exit
}

foreach e {ab1 ab2 ab3} { pack .$e -side left }

 他のウィジェットと同じく、ArrowButtonコマンドのオプションか、 ウィジェット名のconfigureでオプションを指定することができます。 -typeはbutton、 arrowがあり、デフォルトはbuttonです。 -dirは矢印の方向、top、left、right、buttomがあり、デフォルトはtopです。 矢印の色は-fg(デフォルトは黒)、 マウスカーソルがボタンの上に来たときの矢印の色は-activeforegroundで指定できます。
 また、ボタンが押されたときに実行するTclコマンドは、 -armcommandオプションで指定できます。普通のボタンの-commandオプションと同じですね。

拡張レビュー分室 top
(first uploaded 2002/07/14 last updated 2003/06/15, MISUMI URANO)