Python Tkinter - 1. 소개와 기본 위젯

2025. 1. 20. 00:14프로그래밍 언어/Python

이론

Tkinter란?

Tkinter는 Python 표준 라이브러리 중 하나로, GUI(Graphical User Interface) 애플리케이션을 쉽게 개발할 수 있는 도구입니다. 최신 Python 배포판은 Tcl/Tk 8.6을 포함하고 있어 최신 기능을 사용할 수 있습니다.

  • 가볍고 사용이 간편: 별도의 설치가 필요하지 않고, Python과 함께 제공됩니다.
  • 크로스 플랫폼 지원: Windows, macOS, Linux 등 다양한 운영 체제에서 동작합니다. 다만, 플랫폼별로 일부 위젯의 외형이나 동작 방식이 약간 다를 수 있으므로 테스트가 필요합니다.
  • 초보자 친화적: Python의 문법과 잘 통합되어 있어 초보자도 쉽게 GUI 애플리케이션을 제작할 수 있습니다.

GUI 프로그래밍의 기본

GUI 프로그래밍은 이벤트 기반 프로그래밍의 한 형태입니다.

  • 이벤트 기반 프로그래밍:
    • 사용자의 동작(클릭, 입력 등)에 반응하여 애플리케이션이 동작합니다.
    • mainloop()는 Tkinter 애플리케이션의 핵심으로, 이를 실행하지 않으면 GUI 창이 표시되지 않습니다. 사용자의 입력을 계속 대기하고 처리하며, 이벤트 루프를 유지합니다.
  • GUI 애플리케이션의 동작 원리:
    • 위젯(Widget): 사용자와 상호작용하는 요소(버튼, 입력 상자 등).
    • 이벤트(Event): 사용자 입력(클릭, 키보드 입력 등).
    • 이벤트 처리(Event Handling): 특정 이벤트가 발생했을 때 실행할 동작을 정의.

Tkinter 설치 및 구성

Tkinter는 Python에 기본적으로 포함되어 있으며, 설치 과정에서 발생할 수 있는 일반적인 오류로는 Python 설치 시 Tcl/Tk 라이브러리가 누락된 경우가 있습니다. 이를 해결하려면 Python을 다시 설치하거나 환경 변수를 확인해야 합니다.

  1. 설치 확인:위 명령어를 실행하여 Tkinter 데모 창이 뜨면 성공적으로 설치된 것입니다.
  2. python -m tkinter
  3. IDE 설정:
    • PyCharm, VSCode와 같은 IDE에서 Python 인터프리터를 설정하면 Tkinter를 사용할 준비가 완료됩니다.

실습

1. 첫 번째 애플리케이션 만들기

다음은 Tkinter 애플리케이션의 기본 구조입니다:

import tkinter as tk

# Tk 객체 생성
root = tk.Tk()

# 창 제목 설정
root.title("첫 번째 Tkinter 앱")

# 창 크기 설정
root.geometry("300x200")

# mainloop 실행
root.mainloop()

코드 설명

  • Tk(): 애플리케이션의 기본 창을 생성합니다.
  • title(): 창의 제목을 설정합니다.
  • geometry(): 창의 크기를 "너비x높이" 형태로 지정합니다.
  • mainloop(): 창을 실행하고 이벤트를 대기합니다.

2. 기본 위젯 다루기

Label: 텍스트 또는 이미지 표시

label = tk.Label(root, text="Hello, Tkinter!")
label.pack()

Button: 클릭 이벤트 처리

def on_button_click():
    label.config(text="Button Clicked!")

button = tk.Button(root, text="Click Me", command=on_button_click)
button.pack()

Entry: 한 줄 입력 상자

entry = tk.Entry(root)
entry.pack()

def show_entry():
    print("Entry content:", entry.get())

button = tk.Button(root, text="Show Entry", command=show_entry)
button.pack()

Text: 여러 줄 입력 상자

text = tk.Text(root, height=5, width=30)
text.pack()

3. 간단한 이벤트 처리

버튼 클릭 시 텍스트 업데이트하기: Tkinter는 기본적으로 스레드 안전하지 않으므로, 멀티스레딩 작업 시 주의가 필요합니다. GUI 업데이트는 반드시 메인 스레드에서 이루어져야 합니다.

def update_label():
    label.config(text="Updated Text!")

label = tk.Label(root, text="Original Text")
label.pack()

button = tk.Button(root, text="Update", command=update_label)
button.pack()

과제

간단한 계산기 만들기

두 숫자를 입력받아 사칙연산 결과를 출력하는 계산기를 만들어 봅시다.

def calculate():
    try:
        num1 = float(entry1.get())
        num2 = float(entry2.get())
        operation = op_var.get()

        if operation == "덧셈":
            result = num1 + num2
        elif operation == "뺄셈":
            result = num1 - num2
        elif operation == "곱셈":
            result = num1 * num2
        elif operation == "나눗셈":
            result = num1 / num2
        else:
            result = "연산 선택 필요"

        result_label.config(text=f"결과: {result}")
    except Exception as e:
        result_label.config(text=f"오류: {e}")

# 첫 번째 숫자 입력
entry1 = tk.Entry(root)
entry1.pack()

# 두 번째 숫자 입력
entry2 = tk.Entry(root)
entry2.pack()

# 연산 선택
op_var = tk.StringVar()
operations = ["덧셈", "뺄셈", "곱셈", "나눗셈"]
for op in operations:
    tk.Radiobutton(root, text=op, value=op, variable=op_var).pack()

# 결과 표시 라벨
result_label = tk.Label(root, text="결과: ")
result_label.pack()

# 계산 버튼
button = tk.Button(root, text="계산", command=calculate)
button.pack()

root.mainloop()

구현 기능

  1. 두 숫자 입력.
  2. 연산 선택(덧셈, 뺄셈, 곱셈, 나눗셈).
  3. 결과를 라벨에 출력.

기대 효과

  • Tkinter의 기본 위젯과 이벤트 처리를 이해하고 직접 구현해 볼 수 있습니다.
  • GUI 애플리케이션의 기본 구조와 동작 방식을 학습할 수 있습니다.