Tcl 是否将复选按钮添加到labelframe?

Tcl 是否将复选按钮添加到labelframe?,tcl,tk,Tcl,Tk,我想实现示例结果,如何将checkbutton添加到labelframe,如果选择checkbutton,框架将被启用,谢谢! 感谢Donal的建议,请在下面列出我的解决方案: frame .f labelframe .f.lf checkbutton .f.lf.cb -text sample label .f.lf.lb -text "This is for test" .f.lf configure -labelwidget .f.lf.cb pack .f pack .f.lf pack

我想实现示例结果,如何将checkbutton添加到labelframe,如果选择checkbutton,框架将被启用,谢谢!
感谢Donal的建议,请在下面列出我的解决方案:

frame .f
labelframe .f.lf
checkbutton .f.lf.cb -text sample
label .f.lf.lb -text "This is for test"
.f.lf configure -labelwidget .f.lf.cb
pack .f
pack .f.lf
pack .f.lf.lb

当我看到这个问题和吉米关于他已经解决了这个问题的评论时,我想还是应该有一个关于如何解决这个问题的解释。当我开始做这件事时,吉米已经加了这样一个解释。不管怎样,我还是把我的建议贴出来,希望它会有用

这个答案部分基于Jeremy Cowgar在页面上的示例,在按钮“Labelframes启用其内容”下。我对代码进行了一点简化、重组和概括,希望在这样做时不会引入bug。我已经尝试了代码,但没有彻底测试它

我在本例中使用了“经典”小部件(在命名空间
tk
中):只需将命名空间更改为
ttk
(如
ttk::labelframe
等)即可获得主题小部件。有时,由于选项或子命令不同,需要进行更多更改,但至少在本示例的范围内,它们的工作方式相同

第一个目标是设置要启用的
labelframe
。它作为labelwidget(通过配置
-labelwidget
选项)获取一个
checkbutton
:checkbutton获取一个全局变量和一个调用过程的命令脚本。只有labelframe需要管理(使用
pack
grid
或其他任何方式),它自己管理checkbutton。checkbutton可以是
.greeter
的子项,但这样它就不同于labelframe中的小部件

tk::labelframe .greeter
tk::checkbutton .greeterEnabler -text {Say Hello} -variable greeterEnabled -command greeterEnablerAction
.greeter configure -labelwidget .greeterEnabler
pack .greeter -fill x -expand yes

proc greeterEnablerAction {} {
    if {$::greeterEnabled} {
        set state normal
    } else {
        set state disabled
    }
    foreach child [winfo children .greeter] {
        $child configure -state $state
    }
}
labelframe中充满了小部件,在本例中只有两个。它们是labelframe的子对象,即它们的窗口路径以
.greeter
开头

set greeterName World
tk::entry .greeter.name -textvariable greeterName

tk::button .greeter.button -text {Do It} -command {puts "Hello, $greeterName"}
labelframe的初始状态已设置。可以直接调用
greeterEnablerAction
过程,而不是使用
invoke
调用

set greeterEnabled 1
.greeterEnabler invoke
labelframe的子级需要显式管理

pack {*}[winfo children .greeter] -fill x
还可以添加独立于labelframe的小部件:

tk::button .bt2 -text Exit -command exit
pack .bt2 -fill x -expand yes
再次完成程序(如果代码在启用Tk的shell(如
wish
)中运行,则无需使用
Tk
包):

文件: , , , , , , , , , , , , ,

我用“-labelwidget”解决了这个问题。这是正确的方法。请写下来作为回答;它将在未来帮助其他人。太棒了!谢谢你如此详尽而有用的解释!这真的让我受益匪浅。
package require Tk

# set up the labelframe with a checkbutton as enabler
tk::labelframe .greeter
tk::checkbutton .greeterEnabler -text {Say Hello} -variable greeterEnabled -command greeterEnablerAction
.greeter configure -labelwidget .greeterEnabler
pack .greeter -fill x -expand yes

proc greeterEnablerAction {} {
    if {$::greeterEnabled} {
        set state normal
    } else {
        set state disabled
    }
    foreach child [winfo children .greeter] {
        $child configure -state $state
    }
}


# fill it with widgets
set greeterName World
tk::entry .greeter.name -textvariable greeterName

tk::button .greeter.button -text {Do It} -command {puts "Hello, $greeterName"}

set greeterEnabled 1
.greeterEnabler invoke

pack {*}[winfo children .greeter] -fill x

# this button is independent of the labelframe
tk::button .bt2 -text Exit -command exit
pack .bt2 -fill x -expand yes