Tkinter Frame

2024. 2. 24. 17:09GUI/tkinter

요약 : 이 튜토리얼에서는 Tkinter 프레임에 대해 배우고 크기, 패딩 및 테두리를 포함한 속성을 조작하는 방법을 배웁니다.

Tkinter Frame 위젯 소개

프레임은 단순한 직사각형으로 표시되는 위젯입니다. 일반적으로 프레임을 사용하여 시각적으로나 코딩 수준에서 다른 위젯을 구성합니다.

프레임을 만들려면 다음 ttk.Frame클래스를 사용합니다.

frame = ttk.Frame(master, **options)

프레임에는 모양을 결정하는 다양한 구성 개체가 있습니다.

borderwidth 프레임의 테두리 너비를 지정합니다. 기본값은 0입니다.
class 위젯 클래스 이름 설정
cursor 마우스 커서가 프레임 위에 있을 때 커서 모양 변경
height 프레임의 높이를 설정합니다.
padding 프레임 내부와 포함된 위젯 외부에 패딩을 만듭니다.
relief 테두리의 릴리프 스타일을 지정합니다. 이를 효과적으로 적용하려면, borderwidth를 세팅할 필요가 있습니다.
style 맞춤 위젯 맞춤 스타일 이름 지정
takefocus 부울 값은 초점 순회 중에 프레임을 방문할지 여부를 지정합니다. 기본적으로는 입니다 False. 따라서 프레임 위젯은 포커스를 받아들이지 않습니다.
width 프레임의 너비를 설정합니다.

프레임 크기

프레임의 크기는 포함된 위젯의 크기와 레이아웃에 따라 결정됩니다. 또한 프레임을 만들 때 프레임의 높이와 너비를 명시적으로 지정할 수 있습니다.

frame = ttk.Frame(master, height, width)

Padding

패딩을 사용하면 프레임 내부와 포함된 위젯 외부에 추가 공간을 추가할 수 있습니다. 패딩은 픽셀 단위입니다.

프레임의 각 측면에 패딩을 별도로 지정하려면 다음을 사용합니다.

frame['padding'] = (left, top, right, bottom)

예를 들어:

frame['padding'] = (5,10,5,10)

또는 다음과 같이 왼쪽, 오른쪽, 위쪽, 아래쪽에 패딩을 지정할 수 있습니다.

frame['padding'] = (5, 10)

이 예에서는 왼쪽 및 오른쪽 패딩이 5이고 위쪽 및 아래쪽 패딩이 10입니다. 모든 측면의 패딩이 동일한 경우 다음과 같이 패딩을 지정할 수 있습니다.

frame['padding'] = 5

프레임 테두리

기본적으로 프레임의 테두리 너비는 0입니다. 즉, 프레임에는 테두리가 없습니다.

프레임의 테두리를 설정하려면 테두리의 너비와 스타일을 모두 설정해야 합니다.

프레임의 테두리 너비는 픽셀 단위입니다. 프레임의 테두리 스타일은 평평하거나, 홈이 있거나, 융기되거나, 능선이 있거나, 단단하거나, 움푹 들어간 형태일 수 있습니다. 프레임의 기본 테두리 스타일은 평면입니다.

다음 예제에서는 프레임의 테두리 너비를 5픽셀로 설정하고 프레임의 테두리 스타일을 sunken로 설정합니다.

frame['borderwidth'] = 5
frame['relief'] = 'sunken'

다음 그림은 프레임의 테두리 스타일을 보여줍니다.

 

 

Tkinter 프레임 예제

메모장과 같은 텍스트 편집기에서 흔히 볼 수 있는 다음과 같은 바꾸기 창을 만들어 보겠습니다.

 

위젯을 더욱 체계적으로 구성하려면 창을 두 개의 프레임으로 나눌 수 있습니다.

  • 왼쪽 프레임은 Label , Entry 및 Checkbox 위젯으로 구성됩니다. 왼쪽 프레임은 2개의 열과 4개의 행이 있는 그리드 형상 관리자를 사용합니다.
  • 오른쪽 프레임은 Button위젯으로 구성됩니다. 오른쪽 프레임은 4개의 행과 1개의 열이 있는 그리드 형상 관리자도 사용합니다.

창에 왼쪽 및 오른쪽 프레임을 배치하려면 행 1개와 열 2개가 있는 그리드 기하학 관리자를 사용할 수 있습니다.

 

다음 프로그램은 위의 Replace 창을 만드는 방법을 보여줍니다.

In [ ]:
import tkinter as tk
from tkinter import TclError, ttk


def create_input_frame(container):

    frame = ttk.Frame(container)

    # grid layout for the input frame
    frame.columnconfigure(0, weight=1)
    frame.columnconfigure(0, weight=3)

    # Find what
    ttk.Label(frame, text='Find what:').grid(column=0, row=0, sticky=tk.W)
    keyword = ttk.Entry(frame, width=30)
    keyword.focus()
    keyword.grid(column=1, row=0, sticky=tk.W)

    # Replace with:
    ttk.Label(frame, text='Replace with:').grid(column=0, row=1, sticky=tk.W)
    replacement = ttk.Entry(frame, width=30)
    replacement.grid(column=1, row=1, sticky=tk.W)

    # Match Case checkbox
    match_case = tk.StringVar()
    match_case_check = ttk.Checkbutton(
        frame,
        text='Match case',
        variable=match_case,
        command=lambda: print(match_case.get()))
    match_case_check.grid(column=0, row=2, sticky=tk.W)

    # Wrap Around checkbox
    wrap_around = tk.StringVar()
    wrap_around_check = ttk.Checkbutton(
        frame,
        variable=wrap_around,
        text='Wrap around',
        command=lambda: print(wrap_around.get()))
    wrap_around_check.grid(column=0, row=3, sticky=tk.W)

    for widget in frame.winfo_children():
        widget.grid(padx=5, pady=5)

    return frame


def create_button_frame(container):
    frame = ttk.Frame(container)

    frame.columnconfigure(0, weight=1)

    ttk.Button(frame, text='Find Next').grid(column=0, row=0)
    ttk.Button(frame, text='Replace').grid(column=0, row=1)
    ttk.Button(frame, text='Replace All').grid(column=0, row=2)
    ttk.Button(frame, text='Cancel').grid(column=0, row=3)

    for widget in frame.winfo_children():
        widget.grid(padx=5, pady=5)

    return frame


def create_main_window():
    root = tk.Tk()
    root.title('Replace')
    root.resizable(0, 0)
    try:
        # windows only (remove the minimize/maximize button)
        root.attributes('-toolwindow', True)
    except TclError:
        print('Not supported on your platform')

    # layout on the root window
    root.columnconfigure(0, weight=4)
    root.columnconfigure(1, weight=1)

    input_frame = create_input_frame(root)
    input_frame.grid(column=0, row=0)

    button_frame = create_button_frame(root)
    button_frame.grid(column=1, row=0)

    root.mainloop()


if __name__ == "__main__":
    create_main_window()

작동 방식.

먼저 tkinter모듈과 tkinter.ttk하위 모듈을 가져옵니다.

In [ ]:
import tkinter as tk
from tkinter import ttk

둘째, create_input_frame() 함수에 왼쪽 프레임을 만듭니다. 다음 코드는 input_frame 내의 모든 위젯에 패딩을 추가합니다.

for widget in frame.winfo_children():
     widget.grid(padx=0, pady=5)

셋째, create_button_frame() 함수에서 오른쪽 프레임을 생성합니다.

넷째, create_main_window() 함수에 루트 창을 만듭니다. 다음 코드는 창에서 최소화/최대화 버튼을 제거합니다.

root.attributes('-toolwindow', True)

이 코드는 Windows에서만 작동합니다.

create_main_window() 함수에서는 왼쪽 프레임과 오른쪽 프레임도 생성하고 그리드 지오메트리 관리자를 사용하여 루트 창에 정렬합니다.

마지막으로 if name == "main": 블록에서 create_main_window() 함수를 호출합니다.

요약

  • ttk.Frame는 다른 위젯을 담을 수 있는 간단한 직사각형 위젯입니다.
  • Tkinter 프레임은 시각적으로 코딩 수준에서 사용자 인터페이스를 구성하는 데 사용됩니다.

'GUI > tkinter' 카테고리의 다른 글

Tkinter Scrollbar  (1) 2024.02.26
Tkinter Text  (0) 2024.02.25
Tkinter Place  (0) 2024.02.23
Tkinter Grid  (0) 2024.02.23
Tkinter Pack  (0) 2024.02.21