BLT

 BLTはベル研で開発され、ルーセント・テクノロジー社にコピーライトされ、 長い間tcltk.comで一次配布されていたTkに対する拡張ライブラリセットです。 Tkの純粋な機能拡張として古くからとても有名なプログラムです。 BLTが何を意味するのかはマニュアルを読んでも 「好きなように解釈してチョ」としか書いてないので、 「Beautiful Lady and Television」の略だと言い張っても間違いではありません。 BLTの現在の版は2.4z (2002/10/15) で、 こちらからダウンロードできます。 Tcl/Tkのバージョン7.5、7.6、8.0以降の各バージョンに対応しています。 2.4pからはスタブ機構に対応したため、 8.2用のBLTは8.3以降でも使うことができます。 反面、バージョン7台のサポートはそろそろ失われつつあるようです。

  1. 各種2次元X-Yグラフ
  2. ハイアラキカルリストボックス
  3. GUI部品に壁紙が貼れる拡張
  4. タブつきパネル
  5. 「busy」ウィンドウ
  6. テーブル状のジオメトリマネージャ
  7. ウィンドウのTkイメージへの取りこみ
などが現在の目玉で、 どれも強烈な外観を我々のGUIアプリケーションにつけてくれます。 高機能なだけにものすごく複雑ですが、付属のHTMLドキュメントの整備は見事で、 これを見ながらやれば簡単に操作になじむことができると思います。 さっそく使い倒してやりましょう。

●インストールしよう、UNIX編
 UNIXではおなじみのconfigure→make→make installでOKですが、 できれば実行プログラム(bltwish)を作るよりも、共有ライブラリ (libBLT24.so)を作ってインストールしたほうが何かと便利です。

% sh configure
% cd src/shared
% make
# make install
% cd ../../library
% make
# make install

/usr/local にインストールしたとすると、 共有ライブラリlibBLT24.so が/usr/local/lib/に、 初期設定用のTclスクリプトが/usr/local/lib/blt2.4 にコピーされます。
(*1) 名前はOSやBLTのバージョンによって細かく違うことがありますが、 ここではこれで通します。 LinuxにBLT 2.4qをインストールしたときにはこんな名前になります。

●インストールしよう、MS-Windows編
 Windows用には、Tcl/Tk本体と同様、 コンパイル済みのバイナリアーカイブが自己解凍書庫形式として配布されているのでインストールは非常に簡単です。 アーカイブをダウンロードすると、とても綺麗なインストーラが現れます。 Tcl/Tkの本体処理系のインストーラ以上に凝った画面で、作者の巧みなセンスを感じさせます。 で、インストール場所を聞かれるので、簡単にしたければ、 既にTcl/Tk本体が入っているディレクトリ (C:\Program Files\TCL とか) を指定すればOKです。 ごちゃまぜになるのがいやなら、 別の新規ディレクトリ(C:\Program Files\BLT とか) を指定します。 インストールすると、bin サブディレクトリの下に 「BLTWISH.EXE」というWISH83.EXEにBLTをインフェクトしたインタープリタと、 「BLT24.DLL」というloadコマンドでロードできるDLLが置かれます。 普通は、BLT24.DLL をロードするほうが使いやすいと思います。 DLL から見て、../lib/blt2.4 にあたる位置には BLT のライブラリが置かれている必要があります(*2)。 ディレクトリ構造は壊さないほうがよいでしょう。

(*2)そうでないやり方に精通されている方はもちろん、 それ以外の場所におくことも可能ですが、それはまた別の話。

●BLT機能を使えるようにするには
 BLT機能を使うTclスクリプトの冒頭部では、こんな記述をしておきます。

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

名前空間(namespace)がいきなり出てきていますが、 とりあえず上のように書いておけば、 以後BLTの機能を使うさいに名前空間について意識する必要がなくなるので、 毎回冒頭部にこう書いておくとよいようです。

●折れ線グラフを描く
 はい、ここには1999年7月から10月まで大嘘を書いておりました。 このよーなことがあるので実験室のHTML文書は決して印刷して残したりしないでくださいね。 実験室の文章をうのみにしてはだめですよ(シクシク)。 BLTで提供されているグラフは、どれもX-Yの2次元です。 グラフの種類は「graph」「barchart」「stripchart」 がありますが、どれも基本はほとんど同じなので、ここではgraphを代表にします。 「graph」「stripchart」が折れ線グラフで、「barchart」が棒グラフです。

ソースプログラムです。

package require BLT
namespace import blt::*
namespace import -force blt::tile::*
wm title . "BLTのサンプル1"

set tenpura {5 10 15 20 25 30 35 40 45}
set fukaido {81.2 72.5 43.4 5.6 18.2 60.9 98.2 99.9 99.8}

pack [set g [graph .g -plotbackground black]]
$g configure -title "気温と人の霊的パワーの関係(騙)"

$g element create line1 -xdata $tenpura -ydata $fukaido
$g element configure line1 -label {2001.7 調査} \
  -symbol square -pixels 4 -color "#ffcc00" -fill "#800000" \
  -outline "#ff0000" -outlinewidth 1 \
  -dashes {2 4 2} -linewidth 2 -trace increasing
# symbol: square, circle, diamond, plus, cross, splus, scross, triangle, ""
$g element show
$g axis configure x -title 温度
$g axis configure y -title 不快度

# マウス操作で拡大、縮小
bind $g <ButtonPress-1> {
    %W axis configure x -min [%W axis invtransform x %x]
    %W axis configure y -min [%W axis invtransform y %y]
}
# もとにもどすしか
bind $g <ButtonPress-3> {
    %W axis configure x -min {}
    %W axis configure y -min {}
}
$g legend configure -position right -relief groove -font fixed -fg blue
$g crosshairs configure -hide no -color red -dashes {2 2} -linewidth 2
Blt_Crosshairs $g
$g grid configure -hide no -dashes { 2 2 }

 まず、X軸とY軸のためのデータを用意します。 基本的には、両軸とも数値軸です。 支店対売上高とか、教科対得点のように片軸(支店、教科)が数値でない場合の方法は、 棒グラフの項にもっていきました。 さて数値データは下のようにそれぞれ数値からなる2つのリストを用意してもよいですが、 BLTで拡張されたデータ構造のベクトル(vector)を使うこともできます。 ここででっちあげたデータは「気温(セシ)」対「不快度(%)」です。 これは私が聞いて回った結果なので間違いありません(大騙)。 40度から45度になって不快度が減っていますが、これは 「その間に悟りの境地に達するはずなので、火もまた涼し」 とよくわからん発言をしたあげく不快度を下げた人が約1名いるためです。

set tenpura {5 10 15 20 25 30 35 40 45}
set fukaido {81.2 72.5 43.4 5.6 18.2 60.9 98.2 99.9 99.8}

次にグラフを作ります。グラフは、独立したTk部品として管理されるので、 「.g」のような名前をつけ、通常のTk部品と同じようにpackできます。
graph .g -plotbackground black
pack .g
.g configure -title "Fukaido Graph"
次にこの部品.gと数値データをくっつけます。 これは「.g element create」コマンドで行います。 これでデータ系列が折れ線として表示されます。 この折れ線に関する設定は「.g element configure」コマンドで下のように行います。 ここではこの折れ線を凡例に表示するときに使う文字列(-label)、 データ点の形状(-symbol)、線の色(-color)、破線の形状(-dashes)、 線の幅(-linewidth)を指定していますが、これはまだ序の口、 こんなオプションがマニュアルにはたくさん載っています。
 折れ線に関する設定が「.g element configure」 でできたのと同様、座標軸に関する設定は「.g axis configure」 コマンドで行えます。
.g element create line1 -xdata $tenpura -ydata $fukaido
.g element configure line1 -label {1999.7 survey} \
  -symbol square -color red -dashes {2 4 2} -linewidth 2
.g element show
.g axis configure x -title {Temperature}
.g axis configure y -title {Uncomfortability}
そのaxis configureで使えるオプションの中に、 -minと-maxという面白いオプションがあります。 これを指定すると、グラフにズームイン・ズームアウトすることができます。
# マウス操作で拡大、縮小
bind .g <ButtonPress-1> { 
    %W axis configure x -min [%W axis invtransform x %x] 
    %W axis configure y -min [%W axis invtransform y %y] 
}
# もとにもどすしか
bind .g <ButtonPress-3> { 
    %W axis configure x -min {}
    %W axis configure y -min {}
} 
ここまでで、大体グラフとしての体裁は完成したはずです。 あとは細かい表示の設定だけなので、省略してもOKです。

 凡例の設定は「.g legend configure」 コマンドで行います。フォントや色などが設定できます。

.g legend configure -position right -relief groove -font fixed -fg blue

クロスヘアというのは、 グラフの上をマウスが走るとそれについて動く交差線のことです。 こいつも破線にしたり、色を変えたりできます。
.g crosshairs configure -hide no -color red -dashes {2 2} -linewidth 2
Blt_Crosshairs .g
最後にグラフの方眼は「.g grid configure」で設定します。
.g grid configure -hide no -dashes { 2 2 } 
できばえはこんな感じです。
BLTのgraphコマンドで作ったグラフのサンプル

●ハイアラキカルリストボックス
 ハイアラキカルリストボックスというのは、 ようするにWindowsのエクスプローラの左半分です。 こんな外観をしています。

BLTのhierboxのサンプル
hierboxコマンドで通常のTk部品と同じようにして作れます。 ただし、このhierboxウィジェットは、 バージョン2.4wでtreeviewなる完全上位互換のウィジェットが登場したため、 Obsolete(将来廃止予定)となっています。 treeviewウィジェットを後ろのページで紹介していますので、 もう下は読まずにそちらに飛んでいかれても構わないでしょう。
ああ、いかないで〜(だからどっちやねん)
hierbox .h -yscrollcommand {.scrv set} -height 200
scrollbar .scrv -orient vertical -command {.h yview}
hierboxの操作方法はinsert、delete、curselection、getなど、 多くがlistboxを模したものになっているので、 すぐに覚えられるはずです。

 ハイアラキカルリストボックスの最大の特徴の階層づけされた項目をつくるには、 まずconfigureサブコマンドの -separatorオプションで1つのリストに共通のセパレータを定義します。 そして、セパレータで始まり、セパレータで区切られた単位が1つずつリストの項目として適当な位置に追加されます。

.h configure -separator {::}
foreach a {::java ::java::awt ::java::io ::java::net ::java::awt::event} {
    .h insert end $a
}
この例では、たとえば「::java::awt」という名前自体が、 ルートの直下にある 「java」という項目の下に「awt」という項目がくるということを表しているので、 「.h insert end $a」で追加しようとすると、 「java」の下に並んでいる項目の一番最後に「awt」 という項目が追加されることになります。

 さて、 ファイルシステムのディレクトリ構造にこれを応用するというのは基本でしょうからやってみます。 まずルートの下のサブディレクトリをリストに追加します。

    .h configure -separator {/}
    foreach e [glob -nocomplain /*] {
	.h insert end $e
    }
 次に、これらの項目のどれかがダブルクリックされたら、 そのディレクトリの中に含まれるファイルやディレクトリをさらに階層的に追加していくようにしましょう。
bind .h <Double-Button-1> {
    if {"[set i [%W curselection]]" != ""} {
        set dir [%W get -full $i]
        foreach e [glob -nocomplain $dir/*] {
            .h insert end $e
        }
    }
}
リストボックスと違い、ハイアラキカルリストボックスのgetコマンドには -fullオプションが追加されています。 これをつけないと、例えば先程の「::java::awt」という項目は 「awt」としか返ってきません。-fullオプションを使うと、 「::java::awt」のような階層つきの名前が返されます。

以上をまとめたソースプログラムです。

package require BLT
namespace import blt::*
namespace import -force blt::tile::*
wm title . "BLTのサンプル2"

entry .ea -state disabled
set f [frame .fa -rel groove]
set h [hierbox $f.h -yscrollcommand "$f.scrv set" -height 200]
scrollbar $f.scrv -orient vertical -command "$f.h yview"
grid $f.h -row 1 -col 1
grid $f.scrv -row 1 -col 2 -sticky ns
foreach e {ea fa} {pack .$e -side top -fill x}

$h configure -separator {::}
foreach a {::java ::javax ::javax::swing ::java::io ::java::net ::javax::swing::table
           ::javax::naming ::javax::naming::directory} {
    $h insert end $a
}
bind $h <Double-Button-1> {
    if {"[set i [%W curselection]]" != ""} {
        .ea configure -state normal
        .ea delete 0 end
        .ea insert end "[%W get $i] : [%W get -full $i]"
        .ea configure -state disabled
    }
}

拡張レビュー分室 top
(first uploaded 1999/07/03 last updated 2004/03/19, KAZUHISA ESHI - MISUMI URANO)