2013-05-08 3 views
1

У меня есть следующий в приложении TCL/Tk:Использования трассировки для выполнения прока в TCL

proc greyout { } { 
    puts "current part $DSM::Part" 
    switch $DSM::Part { 
Doghouse { 
    for {set entry 1} {$entry<17} {incr entry} { 
     .dsm.traceCTRpart$entry configure -state disabled 
     .dsm.traceLATpart$entry configure -state disabled 
     .dsm.traceStowage$entry configure -state disabled  
     .dsm.traceDoghouse$entry configure -state enabled} 
     } 
    Stowage { 
    for {set entry 1} {$entry<17} {incr entry} { 
     .dsm.traceCTRpart$entry configure -state disabled 
     .dsm.traceLATpart$entry configure -state disabled 
     .dsm.traceStowage$entry configure -state enabled   
     .dsm.traceDoghouse$entry configure -state disabled} 
     } 
    } 
} 

    trace add variable DSM::Part write greyout 

Каждый раз, когда «часть» изменяет след пробует вызвать greyout, но я получаю следующее сообщение:

wrong # args: should be "greyout" 
wrong # args: should be "greyout" 
while executing 
"greyout Part {} write" 
(write trace on "Part") 
invoked from within 
"variable Part "CTR_Partition"" 
(in namespace eval "::DSM" script line 3) 
invoked from within..... 

Я не понимаю, почему ?! Любая помощь там?

ответ

1

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

Самый простой способ адаптации кода для обработки это сделать greyout принимать произвольное число аргументов, используя специальный args формальный аргумент:

proc greyout {args} { 
    puts "current part $DSM::Part" 
    ... 
} 
Смежные вопросы