2013-03-10 2 views
0

Tk 위젯의 "유형"이 무엇인지 알 수있는 방법이 있습니까?Tk 위젯의 유형 찾기

예를 들어, tk::label 명령 또는 ttk::label 명령을 사용하여 레이블을 생성한다고 가정 해 보겠습니다.

그 후, 위젯의 경로 이름이 있습니다 (예 : .l). 자, .l을 만드는데 사용 된 명령이 무엇인지 알고 싶습니다. 내가 필요로 무엇

는 프로그래밍 솔루션, 명령의 이름을 반환 할 수 .l 경로를 제공하는 코드이며, 나는

C.

코딩 티클 솔루션, 또는 Tcl의 확장에 관심이 있어요 이를 수행하는 방법은 모두 정보를 어딘가에 저장 한 다음 원래 명령이 수행하는 것과 정확히 동일한 작업을 수행하는 procs를 사용하여 위젯 생성 명령을 바꿀 수 있지만이 솔루션을 사용하려면 사용 가능한 모든 위젯 생성 명령을 알고 있어야하며 ' 사용자 정의 위젯 (또는 전체 메가 바이트)을 고려하지 마십시오.

도움 주셔서 감사합니다.

답변

3

winfo class 명령 (이 대화 형 세션 참조) 충분한 일반적으로 좋은 위젯의 클래스를 말할 것이다 : 당신이에 표준적인 Tk toplevels와 TTK 위젯의 클래스를 설정할 수 있습니다

% label .tklabel;  puts [winfo class .tklabel] 
Label 
% ttk::label .ttklabel; puts [winfo class .ttklabel] 
TLabel 

주 창조 시간. 이것은 일을 다소 복잡하게 만들 수 있습니다. 상위 레벨을 사용하면 [winfo toplevel $w] eq $w이 true인지 여부를 확인할 수 있지만 상위 위젯을 다른 위젯의 하위 항목으로 변경하거나 기본 프레임을 최상위 스타일 (wm forget/wm manage)로 바꿀 수 있으므로 8.5 이후의 테스트는 보장되지 않습니다.

당신이 위젯을 만드는 데 사용되는 정확한 명령을받을이 경우, 유일한 진정한 확인 방법은 트랩 생성 명령이며,이 같은 정보, 로그 : 그것은 일반적으로 쉽게

rename frame the_real_frame 
proc frame {pathName args} { 
    set ::creationInfo($pathName) [list frame $args] 
    the_real_frame $pathName {*}$args 
} 

을 그러한 복잡성을 피하십시오 (특히 프로덕션 환경에서는 <Destroy> 이벤트를 처리하도록 설정해야하므로 더 이상 존재하지 않는 위젯에 대한 정보를 정리할 수 있고 많은 트릭을 추가 할 수 있습니다).

+1

아니요, 완벽한 해결책이 없습니다. 이런 종류의 일을 마친 대부분의 사람들은 GUI 직렬화를 시도하고 있으며 툴킷이 아닌 애플리케이션의 관점에서 볼 때 상위 레벨에서 더 잘 수행됩니다. Tk는 꽤 많은 수의 위젯을 내부적으로 사용하여 아마 가로 채지 않을 것입니다. –

+0

Donal, 고맙습니다. :) 그러나, 아니요, GUI 직렬화 경로를 따르지 않을 것입니다. 나는 Tcl/Tk를 사용하는 대형 GUI 프로그래밍과 그 복잡성을 처리하는 방법에 대해 생각하고있다. –

+0

@Marco 우리는 당신이 찾고있는 것을 정확하게 가지고 있지 않습니다. 대형에서는 위젯을 중심으로 수업을 마무리하고 그 수준에서 물건을 외우는 것이 더 쉽다고 생각합니다. 예를 들어 특정 메시지가있는 창을 띄웠다는 것을 기억하고 대화 상자가 내부적으로 구성되거나 배치 된 방식이 아닙니다. –