2012-07-31 1 views
1

저는 Tcl/Tk에 비교적 익숙하지만 지난 몇 주 동안 논스톱으로 성공적으로 작업 해 왔습니다. 대부분의 경우 그것은 매우 간단합니다. 그러나, 나는 아마 단순한 아마 걸림돌을 쳤다. 그러나 나는 그것을 이해하는 것처럼 보일 수 없다.Tcl/Tk : 크기를 조정할 때 프레임이 잘못 작동합니다.

문제를 설명하는 몇 줄에 상당히 복잡한 코드가 줄었습니다.

간단한 예제에서는 각각에 간단한 레이블 위젯이있는 2 개의 labelframes를 생성합니다. 메인 윈도우의 크기를 조정 (즉, 확장) 할 때 "왼쪽"프레임의 크기를 y 방향으로 만 변경하고 "중간"프레임의 크기를 x 및 y로 조정합니다. 그 부분은 잘 작동합니다.

그러나 크기를 조정할 때 프레임이 서로 붙어 있기를 원합니다. 즉, 둘 다 크기가 조정될 때 "중간"프레임이 "왼쪽"프레임에 달라 붙어 있어야합니다. 대신, 저는 두 사람 사이에 틈이 생기는 것을 봅니다.

다시 말하지만, 이것은 더 복잡한 프로그램의 간단한 코드 비트입니다. 동일한 프로그램에서 그리드와 팩 명령을 혼합하지 않으려 고 노력하고 있으며 원래의 더 복잡한 프로그램에서는 그리드를 사용하는 것이 매우 다루기 힘들게되었습니다. 따라서 "팩"을 사용하는 솔루션이 선호됩니다. 그러나 적절한 설명은 좋은 시작일 것입니다.

내 작은 예 :

#!/usr/bin/wish 

## Set up two main frames 
set frameLeft [labelframe .frameLeft] 
set frameMiddle [labelframe .frameMiddle] 

pack $frameLeft -fill y -expand 1 
pack $frameMiddle -fill both -expand 1 
pack $frameLeft $frameMiddle -side left -anchor nw 

## Instead of the previous 3 lines, I also tried: 
#pack $frameLeft -fill y -expand 1 -side left -anchor nw 
#pack $frameMiddle -fill both -expand 1 -side left -anchor nw 

## Set up component in LEFT frame 
set frameOne [labelframe $frameLeft.frameOne] 
set labelOne [label $frameOne.labelOne -text "Label One:"] 

pack $labelOne -anchor nw 
pack $frameOne -anchor nw 

## Set up component in MIDDLE frame 
set frameTwo [labelframe $frameMiddle.frameTwo] 
set labelTwo [label $frameTwo.labelTwo -text "Label Two:"] 

pack $labelTwo -side left 
pack $frameTwo -anchor nw 

답변

3

우선 일반적으로 복잡한 레이아웃을 디버깅하여 프레임에 화려한 색상을 넣을 때 도움이됩니다. 물론, 프로덕션 환경에 남겨 두지는 않을 것이지만 훨씬 단순하게 사용하고있는 Geometry 관리자의 동작을 이해하게됩니다.

코드를 살펴보면 위젯 두 개가 모두 가로 방향으로 동일한 공간을 할당 받고 있음을 알 수 있습니다. 그런 다음 위젯이 할당 된 공간을 채우는 반면 .frameLeft 위젯은 해당 공간의 왼쪽에 달라 붙습니다. 그래서 문제는 내의 내의 위젯 동작이 아니라 "공간 패킷"이 아니라 공간 할당입니다.

이제 pack으로 추가 공간 할당은 -expand 옵션으로 제어됩니다. 여분의 공간은 확장이 활성화 된 패킷간에 공유됩니다. 즉 원하는 레이아웃을 얻으려면 이 아닌이 으로 설정되고 .frameLeft이어야합니다.

+0

방이 충분하지 않을 때 물건을 다루는 알고리즘이 있지만, 항상 저를 혼란스럽게합니다. 복잡한 레이아웃을 수행하는 데 더 복잡하지만 사용하기 쉬운'grid'를 선호합니다. (또한 왜'-text' 레이블없이'labelframe' 위젯을 사용하고 있습니까?) –

+0

고마워! 나는 내가 어디로 잘못 갔는지 안다. 다시 말하면, 나의 예는 복잡한 문제의 단순화이다. 그래서 나의 실제 문제는 당신의 설명으로는 어쩔 수 없지만, 나는 그것을 알아낼 수 있었다. 내가 말했듯이, 나는 아직도 약간 새로운데, 분명히 나는 ​​내가 가지고있는 줄 알았던 안락한 수준에 이르지 못했다. – user1074069

+0

@ user1074069 나는 단지 몇 가지 문제가 '그리드'(교활한 트릭이 있음)로 더 잘 해결되고 실제 사용자 인터페이스를 사용자에게 충분히 단순하게 유지하려고 시도하면서 실험을 권할뿐입니다. –

0

나는 당신이 "팩"대답을 선호 이해하지만 그리드는 일반적으로 "끈적 끈적한"옵션에 쉽게에서 충전 및 확장을 처리하기 때문에 처리하기가 훨씬 쉽다 핸들링 의미론. 네가 그 일에 곤란을 겪은 것에 나는 조금 놀랐다. 불행히도, 나는 "그리드"에 잠겨 있습니다. 다음 "그리드"솔루션이 당신이 찾고있는 것을합니까?

#!/usr/bin/env wish 

## Set up two main frames 
set frameLeft [labelframe .frameLeft] 
set frameMiddle [labelframe .frameMiddle] 

grid $frameLeft -row 0 -column 0 -sticky nse 
grid $frameMiddle -row 0 -column 1 -sticky nsew 
grid columnconfigure . {0 1} -weight 1 
grid rowconfigure . 0 -weight 1 

## Set up component in LEFT frame 
set frameOne [labelframe $frameLeft.frameOne] 
set labelOne [label $frameOne.labelOne -text "Label One:"] 

grid $frameOne -sticky nw 
grid $labelOne -sticky nw 

## Set up component in MIDDLE frame 
set frameTwo [labelframe $frameMiddle.frameTwo] 
set labelTwo [label $frameTwo.labelTwo -text "Label Two:"] 

grid $frameTwo -sticky nw 
grid $labelTwo -sticky nw 
+0

"그리드"가 더 적절할 것으로 예상되었지만 별도의 구성 요소로 복잡한 레이아웃을 구축 할 때 더 많은 문제를 일으키기 시작했습니다. 어쩌면 나의 미숙 함이 아직도 보여줄 수 있습니다. 이제 내가 원하는 것을 얻었고 그리드로 리팩터링하고 내가 배운 것을 보게 될 것입니다. 감사. – user1074069