У меня есть следующая процедура, которая меняет цвет кнопки выбора файла в зависимости от того, существует ли текущий путь в поле ввода или нет. Первый цикл 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
}
Ответ 1 · рейтинг 1 · glenn jackman
У вас есть только 5 элементов в этих списках, но ваш цикл повторяется 6 раз. Вы, вероятно, хотите {$n < 5} или {$n < [llength $FilePathList]}
Примечание о стиле/эффективности: вам не нужно проверять существование дважды
if {[ file exists $Path ]} {
$Button configure -background green
} else {
$Button configure -background red
}
or
$Button configure -background [expr {[ file exists $Path ] ? "green" : "red"}]
Ответ 2 · рейтинг 2 · Peter Lewerin
Вы должны иметь возможность заменить цикл этой конструкцией:
foreach Path $FilePathList Button $Buttons {
if {[file exists $Path]} {
$Button configure -background green
} else {
$Button configure -background green
}
}
Написание таким образом означает, что вам не нужно отслеживать количество элементов. Однако, если какой-либо из списков когда-либо будет иметь больше элементов, чем другой, другая переменная итерации получит пустые значения для соответствия.