Checkbox 如何实现功能介于radiobutton和checkbutton之间的按钮?

Checkbox 如何实现功能介于radiobutton和checkbutton之间的按钮?,checkbox,radio-button,tcl,tk,Checkbox,Radio Button,Tcl,Tk,我想根据用户选择的选项动态禁用或启用复选按钮。我想要的是radiobutton和checkbutton之间的交叉 检查按钮c1-文本c1-变量c1 checkbutton.c2-文本c2-变量c2 checkbutton.c3-文本c3-变量c3 checkbutton.c4-文本c4-变量c4 网格c1-w 网格c2-粘性w 网格c3-w 网格c4-粘性w 在上面的示例中,如果我选中C1,那么选项C2和C4应该灰显。 类似地,如果我选中C3,那么C4应该是灰色的 如果有一种优雅的方法来实现ra

我想根据用户选择的选项动态禁用或启用复选按钮。我想要的是radiobutton和checkbutton之间的交叉

检查按钮c1-文本c1-变量c1 checkbutton.c2-文本c2-变量c2 checkbutton.c3-文本c3-变量c3 checkbutton.c4-文本c4-变量c4 网格c1-w 网格c2-粘性w 网格c3-w 网格c4-粘性w 在上面的示例中,如果我选中C1,那么选项C2和C4应该灰显。 类似地,如果我选中C3,那么C4应该是灰色的


如果有一种优雅的方法来实现radiobutton和checkbutton之间的交叉,并且随着选项数量的增加而扩展,那就太好了。

听起来您只需要在选中支票簿时监听,然后在此基础上禁用/启用其他框。您可能还需要为每个框保留禁用计数,并确保每个框仅在禁用计数为零时启用。因此,检查C3,然后检查C1,然后再次检查C1,将不会重新启用C4,因为C4的禁用计数仍为1。再次检查C3实际上将使C4的禁用计数为零,并且应重新启用C4


您可以概括此功能,并以某种描述性的方式而不是功能性的方式链接复选框。

听起来您只需要在选中支票簿时监听,然后在此基础上禁用/启用其他复选框。您可能还需要为每个框保留禁用计数,并确保每个框仅在禁用计数为零时启用。因此,检查C3,然后检查C1,然后再次检查C1,将不会重新启用C4,因为C4的禁用计数仍为1。再次检查C3实际上将使C4的禁用计数为零,并且应重新启用C4


您可以概括此功能,并以某种描述性方式链接复选框,到目前为止,实现启用和禁用这种复杂模式的最简单机制是对示例中的触发变量c1和c3进行跟踪,以便在它们发生变化时重新计算状态

# _After_ initializing the state...
trace add variable c1 write reconfigureButtons
trace add variable c3 write reconfigureButtons
proc reconfigureButtons args {
    global c1 c3
    .c2 configure -state [expr {$c1      ? "disabled" : "normal"}]
    .c4 configure -state [expr {$c1||$c3 ? "disabled" : "normal"}]
}
从概念上讲,您将控制器的一部分挂在模型上,而不是视图上,因为这是更“标准的”-我们通常不会用MVC for Tk来谈论,因为Tk带有内置的控制器来完成最基本的工作-但它都是直接工作的,您可以设置它一次,以后就不用再摆弄它了


但是,不要像你的问题文本所显示的那样混淆复选按钮和单选按钮。请这是因为它们为用户提供了不同的视觉提示:复选按钮是开关,单选按钮是“选择其中一个”,以任何其他方式使用它们只会使事情更难使用,没有其他好处。

到目前为止,实现启用和禁用这种复杂模式的最简单机制是跟踪示例中的触发变量c1和c3,以便在它们更改时重新计算状态

# _After_ initializing the state...
trace add variable c1 write reconfigureButtons
trace add variable c3 write reconfigureButtons
proc reconfigureButtons args {
    global c1 c3
    .c2 configure -state [expr {$c1      ? "disabled" : "normal"}]
    .c4 configure -state [expr {$c1||$c3 ? "disabled" : "normal"}]
}
从概念上讲,您将控制器的一部分挂在模型上,而不是视图上,因为这是更“标准的”-我们通常不会用MVC for Tk来谈论,因为Tk带有内置的控制器来完成最基本的工作-但它都是直接工作的,您可以设置它一次,以后就不用再摆弄它了


但是,不要像你的问题文本所显示的那样混淆复选按钮和单选按钮。请这是因为它们为用户提供了不同的视觉提示:复选按钮是开关,单选按钮是“选择其中一个”,而以任何其他方式使用它们只会让东西更难使用,没有其他好处。

此外,8.5中的Tk小部件演示包括使用checkbutton启用的演示。更正:跟踪变量c1 w重新配置按钮,而不是跟踪添加变量c3 writereconfigureButtons@Anand:只有当你深深地陷入过去,仍然在使用Tcl 8.3时。如果你是,那就开始这个计划吧!8.3已终止使用多年。它的后继版本8.4也接近EOL,8.6.0发布后将有一个最终版本。生产代码应该使用8.5。旧的语法仍然受支持,但实际上,为什么还要使用它?它几乎没有记忆功能,并且可能在将来的某个时候消失——但公平地说,不是在8.6中;读了你的评论后,我意识到这是一个古老的愿望。很抱歉。另外,8.5中的Tk小部件演示包括一个使用checkbutton启用东西的演示。更正:跟踪变量c1 w重新配置按钮,而不是跟踪添加变量c3 writereconfigureButtons@Anand:只有当你深深地陷入过去,仍然在使用Tcl 8.3时。如果你是,那就开始这个计划吧!8.3多年来一直是生命的终结
阿尔斯。它的后继版本8.4也接近EOL,8.6.0发布后将有一个最终版本。生产代码应该使用8.5。旧的语法仍然受支持,但实际上,为什么还要使用它?它几乎没有记忆功能,并且可能在将来的某个时候消失——但公平地说,不是在8.6中;读了你的评论后,我意识到这是一个古老的愿望。对不起。