在labelframe中添加一个checkbutton?

时间:2017-10-10 04:31:51

标签: tcl tk

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

当我看到这个问题并且Jimmy评论说他已经解决了这个问题时,我认为应该仍然有解释如何去做。当我开始这样做时,吉米已经添加了这样的解释。无论如何,我发布了我的建议,希望它有用。

这个答案部分基于Jeremy Cowgar在http://wiki.tcl-lang.org/20054页面上的示例,在按钮" Labelframes下启用其内容"。我已经对代码进行了简化,重构和一般化,希望在执行此操作时不会引入错误。我已经尝试过代码但没有彻底测试过。

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

第一个目标是设置即将启用的labelframe。它获得checkbutton作为labelwidget(通过配置-labelwidget选项):checkbutton获取一个全局变量和一个调用过程的命令脚本。只需要管理labelframe(使用packgrid或其他),它自己管理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(例如Tk)中运行,则不需要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)exitforeachgridiflabelframe (widget)packpackageprocputssetwinfo{*} (syntax)