Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: LumpiОтветов: 2

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

}
  • Что это за кнопки? Являются ли они кнопками или ttk::buttons? glenn jackman 23.01.2014
  • просто простые кнопки, а не ttk:: Lumpi 23.01.2014

buttontcltk

Ответы

Ответ 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
    }
}

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы