我需要两个复选按钮,当“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':没有这样的变量
校验按钮是用变量命名的,但它是不可访问的。
发布于 2015-02-19 13:46:57
您遇到的问题是,您正在一个过程中运行这段代码(很明智!)然而,回调脚本正在全局级别上进行评估;它们不是闭包,它们只是普通的旧脚本。
修复方法是将回调代码放入以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只会执行任何必要的引用。
https://stackoverflow.com/questions/28607742
复制相似问题