2011-07-29 1 views
3

자동화 된 테스터를 제어하는 ​​Tcl 스크립트가 있습니다. 지금까지 명령 프롬프트에서 사용자 입력을받은 콘솔 프로그램이었습니다. 동료가 스크립트로 시작할 수있는 Tk GUI를 작성했습니다. 필자는 Tk를 직접 사용한 적이 없으므로 많은 구문을 이해하지 못합니다.Tcl/Tk bind에는 전역 변수가 필요합니까?

테스트 시작시 스크립트는 운영자로부터 장치 일련 번호를 가져와야합니다.

proc GetSerialNumber {} { 
global gUserInterfaceBarCode 

DisplayMessage "Enter serial number:" 

.c.serialnumberbox configure -state normal 

focus .c.serialnumberbox 

bind .c.serialnumberbox <Return> { set gUserInterfaceBarCode [.c.serialnumberbox get] } 

tkwait variable gUserInterfaceBarCode 

#grid forget .c.serialnumberbox 

.c.serialnumberbox configure -state disabled 

} 

DisplayMessage 단순히 GUI에 텍스트 레이블을 업데이트하는 절차입니다 : 이것은 내 동료가 그렇게 쓴 기능입니다.

일련 번호를 저장하는 데 사용되는 글로벌 변수 gUserInterfaceBarCode이 있다는 사실을 싫어합니다. 대신 로컬 변수를 사용하여 프로 시저에서 해당 값을 반환하도록 할 수 있습니까?

올바르게 이해하면 tkwait variable gUserInterfaceBarCode 행을 빼면 해당 변수가 변경 될 때까지이 기능이 차단되지 않습니다. 이것이 GUI 요소에서 사용자 입력을 캡처하는 가장 좋은 방법입니까?

답변

6

기본적으로 변수를 기다려야합니다. 아쉽게도 <Return>의 코드는 proc 내부의 코드와 다른 컨텍스트 (전역 컨텍스트)에서 실행되며 해당 코드가 proc의 로컬 변수를 처리 할 방법이 없습니다.

그러나 전역 변수를 사용할 필요는 없습니다. 전역 적으로 주소 지정이 가능해야합니다. 즉, 네임 스페이스 변수를 대신 사용할 수 있습니다.

namespace eval GetSerialNumber { 
    proc GetSerialNumber {} { 

     DisplayMessage "Enter serial number:" 
     .c.serialnumberbox configure -state normal 
     focus .c.serialnumberbox 
     bind .c.serialnumberbox <Return> { set ::GetSerialNumber::result [.c.serialnumberbox get] } 
     tkwait variable ::GetSerialNumber::result 
     .c.serialnumberbox configure -state disabled 
     return $::GetSerialNumber::result 
    } 
} 

set serialNum [GetSerialNumber::GetSerialNumber] 

또 다른 대안은 명시 적으로 반환하기 전에 gUserInterfaceBarCode을 삭제하는 것입니다 :

그것은 가치가 무엇인지에 대한
tkwait variable ::gUserInterfaceBarCode 
set result $::gUserInterfaceBarCode 
unset ::gUserInterfaceBarCode 
return $result 

는 Tk의 핵심 구현에 대한 네임 스페이스 방식을 사용 자체 내장 된 대화의 구현, "열기처럼 파일 "대화 상자를 엽니 다.

+1

Tk 스크립트는 범위를 다루기가 더 쉬운 자체 도우미 절차에서 막연하게 복잡한 작업도 수행합니다. –

+0

대부분의 Tcl OO 확장은 객체 인스턴스 변수가 네임 스페이스 변수처럼 보이게하므로 OO 확장을 사용하여 변수를 좀 더 캡슐화 할 수도 있습니다. 세 번째 방법은 각 값에 대해 하나의 변수 이름을 사용하는 대신 모든 상태에 대해 하나의 전역 배열 변수를 사용하는 것입니다. – schlenk