向标签框添加一个复选按钮?
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 需要管理(使用 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 充满了小部件,在这个例子中只有两个。它们被设为标签框的子项,即它们的 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)
我想实现示例结果,如何在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 需要管理(使用 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 充满了小部件,在这个例子中只有两个。它们被设为标签框的子项,即它们的 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)