본문 바로가기

코딩/파이썬 tkinter

[Tkinter] 7장. Geometry Manager

tkinter.Pack/Grid/Place

tkinter에는 아래와 같이 세 개의 geometry manager가 있습니다.

 

  • tkinter.Pack 클래스
  • tkinter.Grid 클래스
  • tkinter.Place 클래스

다음과 같이 Geometry manager에 대한 설명은 조금 난해하나, 쉽게 말하여 Label이나 Button, 심지어 Frame 또는 Menu 등 화면에 보이는 대부분의 요소는 위젯으로 분류될 수 있으며, 각 위젯은 geometry manager에 의해 화면에 표시되는 위치가 정해집니다.

 

  • A geometry manager that arranges the children of a parent by packing them in order around the edges of the parent

바꿔 말하면 임의 위젯을 생성한 후 geometry manager를 통해 화면에 표시되는 위치를 지정하지 않으면 해당 위젯은 보이지 않게 됩니다.

 

임의 위젯에 대하여 어떠한 geometry manager를 사용할지는 자유입니다.

 

아래 표를 통해 tkinter에 정의되어 있는 각 클래스가 어떤 클래스를 상속하는지 알 수 있습니다. 아래 표와 같이 대부분의 위젯이 Widget 클래스를 상속하며, Widget 클래스는 다시 geometry manager인 Pack, Grid, Place 클래스 모두를 상속하고 있습니다.

 

class BaseWidget(Misc):
class BitmapImage(Image):
class BooleanVar(Variable):
class Button(Widget):
class CallWrapper:
class Canvas(Widget, XView, YView):
class Checkbutton(Widget):
class DoubleVar(Variable):
class Entry(Widget, XView):
class Event:
class EventType(str, enum.Enum):
class Frame(Widget):
class Grid:
class Image:
class IntVar(Variable):
class Label(Widget):
class LabelFrame(Widget):
class Listbox(Widget, XView, YView):
class Menu(Widget):
class Menubutton(Widget):
class Message(Widget):
class Misc:
class OptionMenu(Menubutton):
class Pack:
class PanedWindow(Widget):
class PhotoImage(Image):
class Place:
class Radiobutton(Widget):
class Scale(Widget):
class Scrollbar(Widget):
class Spinbox(Widget, XView):
class StringVar(Variable):
class Text(Widget, XView, YView):
class Tk(Misc, Wm):
class Toplevel(BaseWidget, Wm):
class Variable:
class Widget(BaseWidgetPackPlaceGrid):
class Wm:
class XView:
class YView:
class _setit:

 

아래 그림과 같이 생성한 Label에 대해 geometry manager 중 하나의 Pack 클래스의 pack() 메서드를 호출하지 않으면, 관련된 Label은 화면에 보이지 않게 됩니다.

 

 

위 화면에 대한 파이썬 코드는 아래와 같습니다. 아래 코드와 같이 self.label2 및 self.label5 속성에 대해선 pack() 메서드를 호출하지 않았습니다.

 

import tkinter as tk
import tkinter.ttk as ttk


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.label1 = ttk.Label(self, text='기하학')
        self.label1.pack()

        self.label2 = ttk.Label(self, text='Geometry')
        # self.label2.pack()

        self.label3 = ttk.Label(self, text='선, 면, 도형 등 기하학적인 대상의 모양, 크기, 상대적인 위치')
        self.label3.pack()

        self.label4 = ttk.Label(self, text='그리고 공간의 성질에 대해 연구하는 수학의 한 갈래')
        self.label4.pack()

        self.label5 = ttk.Label(self, text='한자어 기하는 명나라의 서광계가 만든 단어')
        # self.label5.pack()
    # -------------------------------------------------------------------------


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

 

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

[Tkinter] 9장. Grid  (0) 2020.11.08
[Tkinter] 8장. Pack  (0) 2020.11.08
[Tkinter] 6장. Label (ttk)  (0) 2020.11.06
[Tkinter] 5장. Label  (0) 2020.11.05
[Tkinter] 4장. Tk를 상속하는 MainWin 클래스  (0) 2020.11.05