티스토리 뷰

음... 책을 보고 예제를 안 짜니 왠지 잊어버릴것만 같은 느낌.


이 책을 보게 된 이유는 Apkzipper를 Tcl/Tk로 짜려고 생각했기 때문.


처음엔 문법이 굉장히 단순하고 크로스플랫폼 GUI라니! 라고 생각을 했지만, 역시 사용층이 적다는 건 좀 문제였다 ㅠㅠ

게다가 언어 자체가 TclOO를 제외하면 절차지향적이라서... 아직 익숙하지 않아서 그런지 좀 어려움을 느꼈다.

결정적으로 문법이 단순하다고 코딩이 단순한 것은 아니었다는 것. 표준 함수라든가 그런 것들도 알아야 쉬이 짤 수 있는 것인데. 결국 배우는데 오래 걸리게 되었다. (허투루 배우다가 헤맨 것도 한 몫 할 것이다)


좀 이상한 잡설이었다. chap25이전은 대충대충 넘어가 버려서 이번부터라도 따로 정리해두려고 한다.


Part III. Tk Basics의 세번째 챕터인데, 그 이전에 나온 Tk의 기본적인 사항들은 넘어간다. 


윈도우즈 API로 코딩해본 사람들이면 좀 짜증나게 생각되는 부분이 있을 것이다. 바로 창의 위치를 지정해 주는 것.

좌표 하나하나 값을 매겨줘야 하는데, 여간 귀찮은 것이 아니다.


Tk에는 배치 관리자Geometry Manager (굉장히 의역...인데 별로 안 좋으려나;;) 라는게 있어서, 좌표를 일일히 매기지 않고도 창의 모양을 짜임새 있게 만들어 준다. 

Tk에는 이 배치 관리자가 3가지 있는데, pack, grid, place가 그것이다. 그리고 이 관리자 중 하나를 선택하지 않으면 버튼 하나조차 넣을 수 없다.

일단 편하게 쓰기 위해선 외워야 하는 건 필수인 것 같고, 이제 pack 관리자에 대해서 알아보자.


pack은 가장 편하게 쓸 수 있는 관리자다. 말 그대로 '넣어'준다.

가장 간단한 예제로 버튼 한개를 넣어보자.


pack [button .b -text 꽥!]


단순의 극치긴 하다. 이게 점점 복잡해지는 이유는 다른 여러개를 넣기 위해서 세부사항을 지정해주는 옵션을 추가하기 때문이다.


이제 pack으로 만들 목표를 하나 잡아보자. pack으로 다음과 같은 입력대화상자를 만들기 되게 쉽다.



아직은 이렇게 만들 순 없다. 아마도 저 클릭! 버튼이 성가실 것이다 ㅋㅋ

그럼 이렇게 만들기 위해선 뭐가 필요할까?


1. 붙일 위치를 지정해주는 -side옵션

pack 위젯경로 옵션 순인데, -side 다음에 top, bottom, left, right 중 하나를 쓸 수 있다. 그 효과는 다음 예제로 알아보자.


pack [button .b -text 꽥!]
pack [button .c -text 오른쪽] -side right

pack [button .d -text 왼쪽] -side left

pack [button .e -text 아래쪽] -side bottom



ㅇ? 대충 비슷하긴 한데 저 아래쪽 버튼이 거슬린다. 왜 아래로 안 가고 가운데 들어간 거냐.

왜 이렇게 되는 건지 알려면 구멍 모델Cavity model을 알아야 한다. pack 관리자는 이 알고리즘으로 위젯을 삽입하기 때문이다.

간단하다. pack관리자는 새로운 위젯을 삽입할 때 남은 구멍공간에 삽입한다. 아래 그림을 일단 보자.



일단 꽥! 버튼이 위쪽 주황색 공간을 먼저 차지한다. pack을 할 때 -side옵션을 지정하지 않으면 top으로 기본설정된기 때문.

그 다음 오른쪽 버튼과 왼쪽 버튼이 순서대로 각각 하늘색 공간 (나머지 공간의 왼쪽, 오른쪽)을 차지한다.

그럼 초록색 공간이 남는데, 이런 남은 공간이 구멍Cavity이고, 여기에 새로운 위젯이 상하좌우 방향으로 공간을 할당받는 것이다. 아무것도 배정되지 않았을 때는 전체가 구멍이라고 생각하면 된다.


이제 아래쪽 버튼을 추가하게 되면 저 초록색 공간의 아래쪽 부분을 배정받게 되는 것이다. 만약 공간이 부족하다면 창이 저절로 늘어날 것[각주:1]이다.

그리고 이런 공간 점유는 순서대로 먼저 먹는 위젯이 임자기 때문에, 위젯 삽입 순서Stacking order도 중요하다.

이제 위의 코드에 다음 코드를 추가로 넣어보자. 결과가 납득이 갈 것이다.




pack [button .f -text 왼쪽2] -side left

pack [button .g -text 왼쪽3] -side left




이제 위에서 본 입력 대화상자 예제를 만들 수 있게 되었다. 실제로 만들어보고 싶은 사람들을 위해 일단 접어두겠다.

하지만 아래부터는 또 이 코드를 쓸 것이므로 만들어보고 싶은 사람은 지금 만들어보자.




2. -expand 옵션

이제 저 입력 대화상자 크기를 늘려보겠다.



... 이건 좀 아닌 것 같다. 문제가 뭘까.

이 상황에서 각각의 패킹 공간을 살펴보면 이렇다.


왼쪽 엔트리가 저 구멍공간을 다 차지하면 좋을텐데, 이럴 땐 -expand true를 설정하면 사용할 수 있는 구멍이 있을 때 자동으로 패킹공간을 늘어나게 할 수 있다.

이제 다음 코드를 실행해보면





pack config .l -expand true

pack config .e -expand true








3. -fill 옵션

아직 뭔가 부족하다. 엔트리의 패킹 공간(Packing space)은 늘어났는데 위젯의 크기(Display space)는 안 늘어난 것이다.

이제 다음의 코드도 실행해보자.





pack config .e -fill x








이제 좀 괜찮아 보인다. 

-fill 옵션은 none, x, y, both 4가지로 설정할 수 있다.


이제 중요한 부분은 끝났다. 나머지는 덜 중요한 것들이다. 알면 좋지만서도.


4. -padx, -pady, -ipadx, -ipady

바로 위 그림의 "이름을 알려주세요"라벨이 사실 이게 적용되어있다. (스샷의 귀찮음으로 통합)

-pad 옵션은 위젯이 배치될 때 바깥부분에 여백을 주는 것이고, -ipad는 안쪽에 여백을 주는 것인데, 지금 위 사진의 라벨은 -ipadx 3 -pady 3이 걸려있다. 경계면이 보이는건 label -relief sunken이라서 그렇다. (이거였나, 하튼)

x y축의 여백을 조절한다는 건 알 거고, 리스트로 여백을 따로 설정할 수도 있긴 하다.

ipad는 별로 티는 안나지만, 저 텍스트 부분의 영역이 줄어든다.


5. -anchor

expand옵션 설명할 때 나왔는데 저렇게 위젯의 크기보다 패킹 크기가 더 커서 공간이 널널해진 경우가 있다.

anchor nw 같은 식으로 설정하면 북서쪽, 즉 패킹공간 내 좌상단에 위젯이 붙어버린다.

기본값은 center이다.


6. etc

일단 패킹 순서가 중요하다는 건 알 것이다. 그 패킹 순서를 바꾸는 옵션이 -before, -after이다.


이건 안 쓰게 될까나...

raise

pack slaves

pack info










  1. 그런데 창이 저절로 늘어나게 하고 싶지 않다면 어떻게 하면 좋을까? 그때는 propagate 서브커맨드를 쓰면 된다. pack propagate . false를 치면 이런 창 크기 맞춤이 비활성화 된다. [본문으로]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함