Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Tkinter로 창 크기 조절 제어판 만들기: 슬라이더 기반 GUI 완벽 가이드

이 글에서는 Tkinter를 활용해 창의 너비와 높이를 자유롭게 조절할 수 있는 GUI 기반 창 크기 조절 제어판을 만들어 보겠습니다. 슬라이더를 움직이면 새로 열린 창의 크기가 실시간으로 변하는 애플리케이션입니다.

1. 프로젝트 개요

이 애플리케이션을 만들기 위해서는 먼저 창 크기를 조절하는 데 사용할 슬라이더(Scale)를 생성해야 합니다. 슬라이더는 Tkinter의 ttk 라이브러리에서 제공하므로, 이를 먼저 임포트한 뒤 크기를 조절할 새 창을 띄우는 방식으로 진행합니다.

전체 구현은 두 단계로 나눌 수 있습니다.

  • 1단계: 필요한 라이브러리를 임포트하고 슬라이더로 컨트롤 바(제어판) UI를 디자인합니다.
  • 2단계: 슬라이더와 버튼에 연결될 이벤트 함수들을 정의합니다.

2. UI 구성하기: 라이브러리 임포트와 컨트롤 바 디자인

먼저 노트북에 필요한 라이브러리를 모두 임포트하고, 슬라이더를 이용해 컨트롤 바를 디자인합니다. 너비(Width), 높이(Height), 그리고 둘 다(Both)를 조절할 수 있는 세 개의 프레임과 슬라이더를 배치합니다.

# 필요한 라이브러리 임포트
from tkinter import *
from tkinter import ttk

# 객체 생성
win = Tk()

# 창 제목 설정
win.title("Window Resizer")
lab = Label(win, text="Window Resizer", font=('Poppins bold', 20))

# 창(프레임)의 기본 크기 정의
win.geometry("500x500")

# 새 창을 여는 버튼 생성
launch_button = Button(win, text="Launch")
launch_button.pack(pady=10)

# 너비, 높이, 둘 다 조절용 LabelFrame 추가
width_frame = LabelFrame(win, text="Width")
width_frame.pack(pady=10)

height_frame = LabelFrame(win, text="Height")
height_frame.pack(pady=10)

both_frame = LabelFrame(win, text="Both")
both_frame.pack(pady=10)

# 너비 슬라이더
width_slider = ttk.Scale(width_frame, from_=100, to=500, orient=HORIZONTAL, length=200, value=100)
width_slider.pack(pady=10, padx=20)

# 높이 슬라이더
height_slider = ttk.Scale(height_frame, from_=100, to=500, orient=VERTICAL, length=200, value=100)
height_slider.pack(pady=10, padx=20)

# 너비+높이 동시 조절 슬라이더
both_slider = ttk.Scale(both_frame, from_=100, to=500, orient=HORIZONTAL, length=200, value=100)
both_slider.pack(pady=10, padx=20)

# 창 유지
win.mainloop()

여기서 각 슬라이더는 from_=100, to=500으로 설정되어 있어 100픽셀부터 500픽셀 사이의 값을 선택할 수 있습니다. orient 옵션으로 슬라이더의 방향(가로/세로)을 지정하고, length로 슬라이더의 길이를 조절합니다.

3. 이벤트 함수 정의하기

슬라이더와 컨트롤 UI가 준비되었다면, 이제 슬라이더와 창 컨트롤에서 호출될 다양한 함수를 정의해야 합니다.

먼저 컨트롤 패널의 움직임이 표시될 새 창을 여는 함수를 만듭니다. 그다음 너비 변경, 높이 변경, 그리고 둘 다 변경하는 세 가지 함수를 정의합니다.

함수 정의까지 마친 전체 코드는 다음과 같습니다.

# 필요한 라이브러리 임포트
from tkinter import *
from tkinter import ttk

# 객체 생성
win = Tk()

# 창 제목 설정
win.title("Window Resizer")
lab = Label(win, text="Window Resizer", font=('Poppins bold', 20))

# 창(프레임)의 기본 크기 정의
win.geometry("500x500")

# 각 이벤트에 대한 함수 정의
# 새 창 열기
def launch_win():
    global win1
    win1 = Toplevel()
    win1.geometry("100x100")

# 너비 변경
def change_width(x):
    win1.geometry(f"{int(width_slider.get())}x{int(height_slider.get())}")

# 높이 변경
def change_height(x):
    win1.geometry(f"{int(width_slider.get())}x{int(height_slider.get())}")

# 너비와 높이 동시 변경
def change_both(x):
    win1.geometry(f"{int(both_slider.get())}x{int(both_slider.get())}")

# 새 창을 여는 버튼 생성
launch_button = Button(win, text="Launch", command=launch_win)
launch_button.pack(pady=10)

# 너비, 높이, 둘 다 조절용 LabelFrame 추가
width_frame = LabelFrame(win, text="Width")
width_frame.pack(pady=10)

height_frame = LabelFrame(win, text="Height")
height_frame.pack(pady=10)

both_frame = LabelFrame(win, text="Both")
both_frame.pack(pady=10)

# 너비 슬라이더
width_slider = ttk.Scale(width_frame, from_=100, to=500, orient=HORIZONTAL,
                         length=200, command=change_height, value=100)
width_slider.pack(pady=10, padx=20)

# 높이 슬라이더
height_slider = ttk.Scale(height_frame, from_=100, to=500, orient=VERTICAL,
                          length=200, command=change_width, value=100)
height_slider.pack(pady=10, padx=20)

# 너비+높이 동시 조절 슬라이더
both_slider = ttk.Scale(both_frame, from_=100, to=500, orient=HORIZONTAL,
                        length=200, command=change_both, value=100)
both_slider.pack(pady=10, padx=20)

# 창(프레임) 유지
win.mainloop()

핵심 포인트

  • Toplevel()은 메인 창과 별개로 새로운 독립 창을 생성합니다. launch_win() 함수가 호출될 때마다 100×100 크기의 새 창이 열립니다.
  • 슬라이더의 command 매개변수에 함수를 연결하면, 슬라이더 값이 바뀔 때마다 해당 함수가 자동으로 호출됩니다.
  • slider.get()으로 현재 슬라이더 값을 읽어온 뒤, f-string을 활용해 geometry() 메서드에 "너비x높이" 형식으로 전달하여 창 크기를 실시간으로 업데이트합니다.

4. 실행 결과

위 코드를 실행하면 아래와 같은 창 크기 조절기(Window Resizer)가 화면에 나타납니다.

Tkinter로 창 크기 조절 제어판 만들기: 슬라이더 기반 GUI 완벽 가이드

Launch 버튼을 눌러 새 창을 연 후, Width·Height·Both 슬라이더를 움직여 보세요. 슬라이더 위치에 따라 새 창의 크기가 즉시 변하는 것을 확인할 수 있습니다. 이 예제를 확장하면 최소·최대 크기 제한, 크기 값 표시 레이블, 리셋 버튼 등 다양한 기능을 추가할 수 있습니다.