labelframe

Tcl/Tk 8.4から追加されたlabelframe Widgetの小技を紹介します。

基本形は、-textオプションでラベルを指定するやり方です。

基本形のlabelframe
pack [labelframe .f1 -text ラベル -pady 2 -padx 2]

set t 0
foreach str {Option1 Option2 Option3} {
    checkbutton .f1.b$t -text $str
    pack .f1.b$t -side top -fill x -pady 2
    incr t
}

ラベルの位置は、-labelanchorオプションで変更できます。
デフォルトは"nw"になっていますが、"ne"にすると雰囲気が変わります。

基本形のlabelframe
pack [labelframe .f1 -text ラベル -pady 2 -padx 2 -labelanchor ne]

set t 0
foreach str {Option1 Option2 Option3} {
    checkbutton .f1.b$t -text $str
    pack .f1.b$t -side top -fill x -pady 2
    incr t
}

ラベルの代わりに-labelwidgetオプションを使うとWidgetを指定できます。
以下はラベルの代わりにcheckbuttonを使った例です。

checkbuttonのlabelframe checkbuttonのlabelframe
pack [labelframe .f1 -pady 2 -padx 2]
checkbutton .f1.cb -text "Use this option." -variable lfdummy2 \
	-command "lfEnableButtons .f1" -padx 0
.f1 configure -labelwidget .f1.cb

set t 0
foreach str {Option1 Option2 Option3} {
    checkbutton .f1.b$t -text $str
    pack .f1.b$t -side top -fill x -pady 2
    incr t
}

proc lfEnableButtons {w} {
    foreach child [winfo children $w] {
        if {$child == "$w.cb"} continue
        if {$::lfdummy2} {
            $child configure -state normal
        } else {
            $child configure -state disabled
        }
    }
}
lfEnableButtons .f1

基本的には、ラベルの代わりにどんなWidgetも指定できますが、
実用的なのはcheckbuttonとmessageくらいでしょうか。
以下はラベルの代わりにmessageを使った例です。
長いラベルは自動的に折り返すので便利かもしれません。

長いラベルのlabelframe
pack [labelframe .f1 -text ラベル -pady 2 -padx 2]
message .f1.m -text {これは長いラベルですねぇ} -justify left
.f1 configure -labelwidget .f1.m

set t 0
foreach str {Option1 Option2 Option3} {
    checkbutton .f1.b$t -text $str
    pack .f1.b$t -side top -fill x -pady 2
    incr t
}

labelframeの機能を使いこなすとGUIの表現力に格段の差が出ることは間違いないですね。