티스토리 뷰

9.6 기하 관리자(The Geometry Managers)

- Tkinter는 기하 관리자를 이용하여 컨테이너(container)안의 위젯 위치를 정해준다.

- Tkinter는 세 가지 기하 관리자를 제공한다.

ex) gird manager, pack manager, place manager 

- 우리는 이미 그리드 매니저와 팩 매니저는 사용해보았다.

- 이번 챕터에서 추가적인 내용을 배운다.

 

9.6.1 그리드 매니저(The Grid Manager)

그리드 매니저(Grid Manager)는 보이지 않는 격자(grid) 쎌에 위젯을 배치하는 역할을 한다.

- 지정한 행(row)열(column)에 위젯을 배치한다.

rowspancolumnspan 매개 변수를 이용하여 여러 개의 행과 열까지 차지해 확장 배도 가능하다.

 

*그리드 매니저 예제(GridManagerDemo.py) 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from tkinter import *#tkinter 내 모든 정의 임포트
 
class GridMangerDemo:
    window = Tk() # 창 생성
    window.title("Grid Manager Demo")#타이틀 셋
 
    message = Message(window, text = "This Message widget occupies three rows and two columns")
 
    message.grid(row = 1, column = 1, rowspan = 3, columnspan = 2)
    Label(window, text = "First Name : ").grid(row = 1, column = 3)
    Entry(window). grid(row = 1, column = 4, padx = 5, pady = 5)
    Label(window, text = "Last Name: ").grid(row = 2, column = 3)
    Entry(window).grid(row = 2, column = 4)
    Button(window, text = "Get Nmae").grid(row = 3, padx = 5, pady = 5, column = 4, sticky = E)
 
    window.mainloop() #이벤트 루프 생성
 
GridManagerDemo()
cs

 

<실행 결과>

 

- Line 09, 메세지(Message) 위젯은 1행 1열에 위치, 3개의 행과 2개의 열까지 확장된 상태로 배치되어있다.

- Get Name 버튼은 sticky = E 옵션(line 14)을 사용했다.

- 이 sticky 옵션은 버튼을 셀(cell)의 동쪽(East)에 붙이기 위해 사용되었고 그래서 Entry 위젯과 같은 열에 오른쪽 정렬이 되어 있는 것이다.

- sticky 옵션 셀이 위젯보다 클 때 어떻게 위젯을 확장(expand)할 지 정의해주는 역할을 한다.

- sticky 옵션은 상수 S, N, E, W NW, NE, SW, SE의 상수와 함께 쓰인다.

 

- Line 11, 14, padx pady 옵션은 셀에 수평, 수직으로 공백을 넣는 역할을 한다.

- 이 옵션을 이용해 위젯 내부의 경계에도 공백을 넣을 수 있다.

 

9.6.2 팩 매니저(The Pack Manager)

- 팩 매니저(Pack Manager)는 위젯을 서로 에 배치하거나 옆으로 나란히 배치하는데 사용된다.

- fill 옵션을 이용해 위젯을 컨테이너(container) 전체에 채울 수 있다.

 

*팩 매니저 예제 1(PackManagerDemo.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from tkinter import *#tkinter 내 모든 정의 임포트
 
class PackManagerDemo:
    def __init__(self):
        window = Tk() #창 생성
        window.title("Pack Manager Demo 1"# 타이틀 셋
 
        Label(window, text = "Blue", bg = "blue").pack()
        Label(window, text = "Red", bg = "red").pack(fill = BOTH, expand = 1)
        Label(window, text = "Green", bg = "green").pack(fill = BOTH)
 
        window.mainloop()# 이벤트 루프 생성
        
PackManagerDemo()
cs

 

<실행 결과>

 

- 위 예제의 Red 라벨은 BOTH 값을 가진 fill 옵션과 1값을 가진 expand 옵션을 사용했다.

- fill 옵션은 상수 X(수평), Y(수직) BOTH(둘 다)를 이용해 사용한다.

expand 옵션은 팩 매니저가 위젯박스에 추가 공간을 할당하게 만든다.

부모 위젯(parent widget)패킹된 위젯필요로 하는 크기보다 더 큰 경우, expand 옵션값이 0이 아닌 위젯이 그 자리를 메꾼다.

ex) 현재 프로그램에서 부모위젯은 윈도우 창, 패킹된 위젯은 뒤에 pack() 메소드를 이용한 위젯을 의미한다.

 

- 아래는 옆으로 나란히 배치시킨 팩 매니저 예제이다.

 

* 팩매니저 예제 2(PackManagerWithSide.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from tkinter import *#tkinter 내 모든 정의 임포트
 
class PackManagerDemo:
    def __init__(self):
        window = Tk() #창 생성
        window.title("Pack Manager Demo 1"# 타이틀 셋
 
        Label(window, text = "Blue", bg = "blue").pack(side = LEFT)
        Label(window, text = "Red", bg = "red").pack(side = LEFT, fill = BOTH, expand = 1)
        Label(window, text = "Green", bg = "green").pack(side = LEFT, fill = BOTH)
 
        window.mainloop()# 이벤트 루프 생성
        
PackManagerDemo()
cs

 

<실행 결과>

 

9.6.3 장소 매니저(The Place Manager)

- 장소 매니저(Place Manager)는 절대적인 위치에 위젯을 배치시킨다.

- 아래가 예제이다.

 

*장소 매니저 예제(PlaceManagerDemo.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from tkinter import *#tkinter 내 모든 정의 임포트
 
class PlaceManagerDemo:
    def __init__(self):
        window = Tk() #창 생성
        window.title("Place Manager Demo"# 타이틀 셋
 
        Label(window, text = "Blue", bg = "blue").place(x = 20, y = 20)
        Label(window, text = "Red", bg = "red").place(x = 50, y = 50)
        Label(window, text = "Green", bg = "green").place(x = 80, y = 80)
 
        window.mainloop()# 이벤트 루프 생성
        
PlaceManagerDemo()
cs

 

<실행 결과>

 

 

- 왼쪽 상단의 Blue 라벨은 (20, 20) 위치에 배치되어 있다. 그 외 라벨들 역시 이런 방식으로 배치되어 있다.

 

참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.


교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다. 

댓글