我需要两个支票按钮,当' op.invariants'未经检查的“反对信息”#39;必须禁用。当' 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 } }
但是当我执行它时,会导致此错误: 无法阅读'操作:没有这样的变量
checkbutton以变量命名,但不是必须的
答案 0 :(得分:1)
您遇到的问题是您在一个过程中运行此代码(明智地!),但回调脚本正在全局级别进行评估;这些不是封闭,它们只是简单的旧脚本。
修复方法是将回调代码放入以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
只会做任何必要的引用。