我有以下proc,它根据输入框中的当前路径是否存在来更改选择文件按钮的颜色。第一个if循环工作,第二个我得到"无效命令名""执行" $ Button configure -background red"而且我不知道为什么......
proc ::CheckGUIPaths { } {
set FilePathList [list $::GUI_DB_path $::GUI_BDF_path $::GUI_ALLOW_path $::GUI_EXCEL_path $::GUI_HM_path]
set Buttons [list .dsm.nb.f1.btn_DBfile .dsm.nb.f1.btn_BDFfile .dsm.nb.f1.btn_ALLOWfile .dsm.nb.f1.btn_HMfile .dsm.nb.f1.btn_XLfile]
for { set n 0 } { $n <= 5 } { incr n } {
set Path [lindex $FilePathList $n]
set Button [lindex $Buttons $n]
if { [ file exists $Path ] == 1 } {
$Button configure -background green
}
if { [ file exists $Path ] == 0 } {
$Button configure -background red
}
}
return 0
}
答案 0 :(得分:2)
你应该能够用这个结构替换循环:
foreach Path $FilePathList Button $Buttons {
if {[file exists $Path]} {
$Button configure -background green
} else {
$Button configure -background green
}
}
以这种方式书写意味着您不需要跟踪项目数量。但是,如果任何列表的项目数应该比另一个更多,则另一个迭代变量将获得匹配的空值。
答案 1 :(得分:1)
这些列表中只有5个元素,但循环迭代6次。您可能需要{$n < 5}
或{$n < [llength $FilePathList]}
关于风格/效率的说明:您不需要测试两次存在
if {[ file exists $Path ]} {
$Button configure -background green
} else {
$Button configure -background red
}
或
$Button configure -background [expr {[ file exists $Path ] ? "green" : "red"}]