본문 바로가기

코딩/파이썬 tkinter

[Tkinter] 9장. Grid

tkinter.Grid.grid 메서드

Widget 클래스를 상속하는 웨젯들은 Grid 클래스의 grid() 메서드 호출을 통해 해당 위젯의 위치를 설정할 수 있습니다.

 

아래 표는 grid() 메서드를 통해 설정 가능한 옵션을 나타냅니다.

 

column number - use cell identified with given column (starting with 0)
columnspan number - this widget will span several columns
in master - use master to contain this widget
in_ master - see 'in' option description
ipadx amount - add internal padding in x direction
ipady amount - add internal padding in y direction
padx amount - add padding in x direction
pady amount - add padding in y direction
row number - use cell identified with given row (starting with 0)
rowspan number - this widget will span several rows
sticky NSEW - if cell is larger on which sides will this
widget stick to the cell boundary

 

부모 클래스의 아래 메서드를 사용하여 부모 클래스의 크기가 변경되었을 때 (예. 윈도우의 크기를 변경했을 때) 원하는 위치의 위젯 크기도 이에 반응하도록 할 수 있습니다.

 

w.columnconfigure(N, option=value, ...) option = minsize , pad ,weight
w.rowconfigure(N, option=value, ...)
option = minsize , pad ,weight

grid() 메서드로 원하는 위치에 위젯 배치하기

row, rowspan, column, columnspan, sticky, padx, pady

 

import tkinter as tk


class MainWin(tk.Tk):
    def __init__(self, topic):
        tk.Tk.__init__(self)
        self.win_settings(topic)
        self.tkinter_ttk_basics()

    def win_settings(self, topic):
        self.title(f'tkinter / {topic}')
        self.geometry('480x320+200+200')
        self.minsize(200, 200)

    # -------------------------------------------------------------------------
    def tkinter_ttk_basics(self):
        self.count = int()

        # row, column, rowspan, columnspan, sticky
        self.create_label_and_grid()                            #  1, row=0, col=0
        self.create_label_and_grid()                            #  2, row=1, col=0
        self.create_label_and_grid(column=1)                    #  3, row=2, col=1
        self.create_label_and_grid(column=2)                    #  4, row=3, col=2
        self.create_label_and_grid(row=0, column=3)             #  5, row=0, col=3
        self.create_label_and_grid()                            #  6, row=4, col=0
        self.create_label_and_grid(columnspan=2)                #  7, row=5, col=0~1
        self.create_label_and_grid(columnspan=2, sticky=tk.W)   #  8, row=6, col=0~1
        self.create_label_and_grid(columnspan=2, sticky=tk.E)   #  9, row=7, col=0~1
        self.create_label_and_grid(columnspan=2, sticky=tk.EW)  # 10, row=8, col=0~1
        self.create_label_and_grid(row=6, column=2, rowspan=2, sticky=tk.NS)  # 11, row=6~7, col=2
        self.create_label_and_grid(row=6, column=3, rowspan=3, sticky=tk.NS)  # 12, row=6~8, col=3

        # padx, pady
        self.create_label_and_grid(padx=10, pady=10)  #13, row=9, col=0

    def create_label_and_grid(self, **kw):
        self.count += 1
        label = tk.Label(self, relief=tk.SUNKEN)
        label.grid(**kw)
        row = label.grid_info()['row']
        col = label.grid_info()['column']
        label.configure(text='Label {} ({}, {})'.format(self.count, row, col))


if __name__ == '__main__':
    mainwin = MainWin('tkinter.Grid')
    mainwin.mainloop()

 

1) MainWin 클래스의 create_label_and_grid() 메서드 호출을 통해 각 Label 객체를 생성하고 grid() 메서드를 실행합니다. create_label_and_grid() 메서드 없이 아래와 같이 코드를 작성해도 무방할 것입니다. (생성된 객체를 변수에 저장하지 않고 바로 grid() 메서드를 호출)

 

tk.Label(self, text='Label (x, y)', relief=tk.SUNKEN).grid(row=0, column=0)

 

2) 위의 파이썬 코드로는 윈도우 크기를 변경했을 때 위젯들의 크기는 변경되지 않습니다.

 

 

윈도우 크기 변경 시 위젯의 크기도 변경시키기

위에서 작성한 아래의 코드 다음에,

 

        # padx, pady
        self.create_label_and_grid(padx=10, pady=10)  # 13 row=9, col=0

 

다음의 코드를 추가하면, column=3인 Label 5, 12, 14의 가로(x축) 길이가 변경됩니다. 또한 row=10인 Label 14의 세로(y축) 길이 또한 윈도우 크기의 변화에 반응하게 됩니다. columnconfigure 및 rowconfigure의 옵션 weight는 변경되는 크기의 비율을 의미합니다.

 

        # rowconfigure, columnconfigure
        self.create_label_and_grid(column=2, columnspan=2, sticky=tk.NSEW)  # 14 row=10, col=2

        self.columnconfigure(3, weight=1, minsize=50)
        self.rowconfigure(10, weight=1)

 

 

'코딩 > 파이썬 tkinter' 카테고리의 다른 글

[Tkinter] 11장. Label (ttk) 2단계  (0) 2020.11.08
[Tkinter] 10장. Label 2단계  (0) 2020.11.08
[Tkinter] 8장. Pack  (0) 2020.11.08
[Tkinter] 7장. Geometry Manager  (0) 2020.11.07
[Tkinter] 6장. Label (ttk)  (0) 2020.11.06