私がTcl/Tkスクリプトを作るときに最初に必ず(やむにやまれず)書くwid関数。
proc wid {{parent ""}} {
global wid_number
if {[string index $parent end] != "."} {
append parent .
}
return ${parent}wid[incr wid_number]
}
(本題には関係無いけど、「string index」や「lindex」など数値で位置を指定する関数で、末尾を指定するために「end」、末尾2個前を指定するために「end-2」などと書くところが、些細ではあるけどTclを気に入っているポイントのひとつだったりする)
使い方は、例えばframeにfoo、bar、bazというラベルを表示する場合に、以下のようにwindow idを自動生成するために使う。
set wp [frame [wid]]
grid $wp
foreach i {foo bar baz} {
set w1 [label [wid $wp] -text $i]
grid $w1
}
本やWebのスクリプト例だと、
grid [frame .f1]
grid [label .f1.l1 -text foo]
grid [label .f1.l2 -text bar]
grid [label .f1.l3 -text baz]
のようにwindow idを自分で命名しているものがほとんどだけど、実際にスクリプトを書くようになるとwindow idの生成が煩わしくなってきて、結果的にこのやり方に落ち着いた。
いっそウィジェットに「-parent window」みたいなオプションがあっても良さそうに思うんだけど、これまでそういう改良が行われなかったということは、自分でwindow idを明示する方が一般的ということなんだろうか・・・。