向标签框添加一个复选按钮?

Add a checkbutton to the labelframe?

我想实现示例结果,如何在labelframe上添加一个checkbutton,如果select checkbutton,框架将启用,谢谢! sample

感谢 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

当我看到这个问题和Jimmy 说他已经解决了的评论时,我在想应该还是有解释如何做的。当我开始做的时候,吉米已经添加了这样的解释。无论如何,我都会发布我的建议,希望它会有用。

此答案部分基于页面 http://wiki.tcl-lang.org/20054 按钮 "Labelframes that enable their contents" 下 Jeremy Cowgar 的示例。我对代码进行了一些简化、重组和概括,希望这样做时不会引入错误。我试过代码但没有彻底测试它。

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

第一个目标是设置将要启用的 labelframe。它得到一个 checkbutton as labelwidget(通过配置 -labelwidget 选项):checkbutton 得到一个全局变量和一个调用过程的命令脚本。只有 labelframe 需要管理(使用 packgrid 或其他),它自己管理 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 充满了小部件,在这个例子中只有两个。它们被设为标签框的子项,即它们的 window 路径以 .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的Widget:

tk::button .bt2 -text Exit -command exit
pack .bt2 -fill x -expand yes

再次完整的程序(如果代码是 运行 在 Tk-enabled shell 例如 wish):

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

文档: button (widget), checkbutton (widget), exit, foreach, grid, if, labelframe (widget), pack, package, proc, puts, set, winfo, {*} (syntax)