2016-06-23 4 views
0

Я пишу сценарий tcl для изменения цвета рамки на основе доступности лицензии. Если лицензия доступна, она покажет синий цвет еще красного цвета. Это выполняется периодически (и цвет рамки будет изменен в зависимости от доступности), используя tcl каждый proc.Изменение цвета рамки на основе проверки состояния

Но когда я попробовал пакет, забудьте перерисовать рамку. В последовательном цикле он говорит, что виджет уже существует. Я не могу использовать команду configure для цвета рамки, поскольку она не поддерживается. Пожалуйста, предложите решение.

#!/tools/tcl/tcl8.6/bin/tclsh -f 

package require Tk 

proc checkLic {} { 
    set val [exec lmstat -a -c /tools/license/dat/cadence_orbit_3x.dat -f Liberate_MX_Client | grep issued | awk {{print $11}}] 
    puts $val 
    if {$val == 0} { 
     after 1000 
     pack forget .high 
     after 1000 
     frame .high -width 8 -height 30 -background blue 
     pack .high -side right 
    } else { 
     after 1000 
     pack forget .high 
     after 1000 
     frame .high -width 8 -height 30 -background red 
     pack .high -side right 
    } 
} 

proc every {ms body} { 
    eval $body 
    after $ms [info level 0] 
} 

every 1000 {checkLic} 
+1

пакет забыть не разрушает виджет, он просто удаляет его из окна. Вы можете забыть и повторно управлять одним и тем же виджета несколько раз. –

+0

Почему вы ставите прямой «после 1000» внутри обратного вызова? –

+0

Я обновил свой ответ, чтобы надеяться, что проблема будет лучше. –

ответ

1

Кажется, я не думал, что мой ответ через, извините. Я сосредоточился на способах отображения фона, не заметив, что у вас уже есть это. Этот код показывает, как вы можете получить осциллирующий дисплей без проблем обновления, о которых вы говорите. В основном код создает кадр один раз, а затем просто меняет цвет, а не удаляет его и пытается его воссоздать.

set gval 0 

frame .high -width 8 -height 30 -background blue 
pack .high -side right 

proc checkLic {} { 
    # replace this with your own lookup code 
    set val [set ::gval [expr {!$::gval}]] 

    puts $val 
    if {$val == 0} { 
     .high configure -background blue 
    } else { 
     .high configure -background red 
    } 
} 

proc every {ms body} { 
    eval $body 
    after $ms [info level 0] 
} 

every 1000 {checkLic} 

Старый ответ:

Основной frame не запрашивает область окна от своего родителя, поэтому его фон не будет виден.

Чтобы сделать фон видимым вы можете установить высоту и ширину в явном виде:

frame .high -height 20 -width 20 -background blue 
pack .high 

Это должно быть видно, как синий квадрат.

Другой способ сделать область запроса оконной рамы, чтобы дать его содержание, но фон все равно не будет видно, если не указать ширину границы:

frame .high -borderwidth 10 -background blue 
pack .high 
label .high.txt -text foobar 
pack .high.txt 

В любом случае вы можете изменить цвет фона цвет, как это:

.high configure -background red 

может быть, вы бы лучше с помощью label вместо frame:

label .high -width 5 -background blue 
pack .high 
.high configure -background red 

С помощью label вы можете переключаться между значками вместо изменения цвета фона.

Документация: after, eval, expr, frame, if, info, label, pack, proc, puts, set

Смежные вопросы