Tcl configure - сбой фона кнопки

У меня есть следующая процедура, которая меняет цвет кнопки выбора файла в зависимости от того, существует ли текущий путь в поле ввода или нет. Первый цикл 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

}

person Lumpi    schedule 23.01.2014    source источник
comment
Что это за кнопки? Являются ли они кнопками или ttk::buttons?   -  person glenn jackman    schedule 23.01.2014
comment
просто простые кнопки, а не ttk::   -  person Lumpi    schedule 23.01.2014


Ответы (2)


У вас есть только 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"}]
person glenn jackman    schedule 23.01.2014
comment
Для повышения мощности взлома [lindex {red green} [file exists $Path]] - person Donal Fellows; 23.01.2014
comment
@Donal, +1 за злобность и -1 за запутывание! - person glenn jackman; 23.01.2014

Вы должны иметь возможность заменить цикл этой конструкцией:

foreach Path $FilePathList Button $Buttons {
    if {[file exists $Path]} {
        $Button configure -background green
    } else {
        $Button configure -background green
    }
}

Написание таким образом означает, что вам не нужно отслеживать количество элементов. Однако, если какой-либо из списков когда-либо будет иметь больше элементов, чем другой, другая переменная итерации получит пустые значения для соответствия.

person Peter Lewerin    schedule 23.01.2014