(Tcl/Tk) 如何更改复选按钮配置

(Tcl/Tk) How to change checkbutton configurations

我需要两个复选按钮,当 'op.invariants' 未选中时,必须禁用 'op.belief'。并且当 'op.belief' 被勾选时,自动勾选 'ob.invariants'

遵循代码:

checkbutton $op.invariants -text "Find Invariant Violations" -variable mcFindInvViolations -onvalue true -offvalue false \
    -command { if { !$mcFindInvViolations } { set st_abr "disabled";  $op.belief configure -state disabled } else { set st_abr "normal"; $op.belief configure -state normal } }

checkbutton $op.belief -text "Apply Belief Revision" -variable mcApplyBeliefRevision -onvalue true -offvalue false -state $st_abr \
    -command { if { $mcApplyBeliefRevision } { $op.invariants select } }

但是当我执行它时,导致这个错误: 无法读取 'op':没有这样的变量

checkbutton 以变量命名,但无法访问

您遇到的问题是您 运行 将这段代码放在一个过程中(明智地!),但回调脚本正在全局级别进行评估;这些不是闭包,它们只是普通的旧脚本。

解决方法是将回调代码放入以 op 值作为参数的过程中:

proc updatedInvariants {op} {
    global mcFindInvViolations st_abr; # List out variables as needed
    if { !$mcFindInvViolations } {
        set st_abr "disabled"
        $op.belief configure -state disabled
    } else {
        set st_abr "normal"
        $op.belief configure -state normal
    }
}
proc updateBelief {op} {
    global mcApplyBeliefRevision
    if { $mcApplyBeliefRevision } {
        $op.invariants select
    }
}

然后,您构造代码以使用这些回调,以便将 op 的值绑定到它们。使用 list 命令很容易:

checkbutton $op.invariants -text "Find Invariant Violations" -variable mcFindInvViolations -onvalue true -offvalue false \
    -command [list updatedInvariants $op]
checkbutton $op.belief -text "Apply Belief Revision" -variable mcApplyBeliefRevision -onvalue true -offvalue false -state $st_abr \
    -command [list updatedBelief $op]

请注意,即使 op 包含各种奇怪的字符,这仍然有效; list 将只做任何必要的引用。