본문 바로가기
Python

Python Tkinter: GUI 프로그래밍 기초부터 실전까지

by Chandler.j 2024. 11. 1.
반응형

1. Tkinter란?

  • Python의 기본 내장 GUI(Graphical User Interface) 라이브러리
  • 간단한 데스크톱 애플리케이션 제작 가능
  • 크로스 플랫폼 지원 (Windows, Mac, Linux)

2. 주요 위젯(Widgets) 소개

  • Label: 텍스트/이미지 표시
  • Button: 클릭 이벤트 처리
  • Entry: 한 줄 텍스트 입력
  • Text: 여러 줄 텍스트 입력
  • Frame: 위젯 그룹화
  • Canvas: 그래픽 그리기
  • Checkbutton: 체크박스
  • Radiobutton: 라디오 버튼
  • Listbox: 목록 표시

3. 기본 레이아웃 관리자

  • pack(): 순차적 배치
  • grid(): 격자형 배치
  • place(): 절대 위치 배치

4. 실전 예제: 간단한 계산기 만들기

import tkinter as tk
from tkinter import messagebox

class Calculator:
    def __init__(self, master):
        self.master = master
        self.master.title("간단 계산기")

        # 결과 표시창
        self.display = tk.Entry(master, width=30, justify='right')
        self.display.grid(row=0, column=0, columnspan=4, pady=5)

        # 버튼 텍스트
        buttons = [
            '7', '8', '9', '/',
            '4', '5', '6', '*',
            '1', '2', '3', '-',
            '0', '.', '=', '+'
        ]

        # 버튼 생성 및 배치
        row = 1
        col = 0
        for button in buttons:
            cmd = lambda x=button: self.click(x)
            tk.Button(master, text=button, width=5, command=cmd).grid(row=row, column=col)
            col += 1
            if col > 3:
                col = 0
                row += 1

    def click(self, key):
        if key == '=':
            try:
                result = eval(self.display.get())
                self.display.delete(0, tk.END)
                self.display.insert(tk.END, str(result))
            except:
                messagebox.showerror("에러", "잘못된 수식입니다")
                self.display.delete(0, tk.END)
        else:
            self.display.insert(tk.END, key)

# 메인 윈도우 생성
root = tk.Tk()
calculator = Calculator(root)
root.mainloop()


5. 주요 이벤트 처리

  • bind(): 이벤트 바인딩
  • command: 버튼 클릭 이벤트
  • validate: 입력 검증

6. 스타일링 팁

  • configure(): 위젯 속성 변경
  • geometry(): 윈도우 크기 설정
  • resizable(): 크기 조절 가능 여부

7. 또 다른 실용적인 예제: 메모장

import tkinter as tk
from tkinter import filedialog, messagebox

class Notepad:
    def __init__(self, root):
        self.root = root
        self.root.title("간단 메모장")
        self.root.geometry("600x400")

        # 메뉴바 생성
        self.create_menu()

        # 텍스트 영역 생성
        self.text_area = tk.Text(self.root)
        self.text_area.pack(expand=True, fill='both')

    def create_menu(self):
        menubar = tk.Menu(self.root)

        # 파일 메뉴
        file_menu = tk.Menu(menubar, tearoff=0)
        file_menu.add_command(label="새로 만들기", command=self.new_file)
        file_menu.add_command(label="열기", command=self.open_file)
        file_menu.add_command(label="저장", command=self.save_file)
        file_menu.add_separator()
        file_menu.add_command(label="종료", command=self.root.quit)

        menubar.add_cascade(label="파일", menu=file_menu)
        self.root.config(menu=menubar)

    def new_file(self):
        self.text_area.delete(1.0, tk.END)

    def open_file(self):
        file = filedialog.askopenfile(
            defaultextension=".txt",
            filetypes=[("텍스트 문서", "*.txt"), ("모든 파일", "*.*")]
        )
        if file:
            self.text_area.delete(1.0, tk.END)
            self.text_area.insert(1.0, file.read())
            file.close()

    def save_file(self):
        file = filedialog.asksaveasfile(
            defaultextension=".txt",
            filetypes=[("텍스트 문서", "*.txt"), ("모든 파일", "*.*")]
        )
        if file:
            data = self.text_area.get(1.0, tk.END)
            file.write(data)
            file.close()

# 애플리케이션 실행
if __name__ == "__main__":
    root = tk.Tk()
    notepad = Notepad(root)
    root.mainloop()


8. 개발 시 주의사항

  • mainloop()는 반드시 마지막에 호출
  • 위젯의 부모-자식 관계 주의
  • 적절한 레이아웃 관리자 선택
  • 이벤트 처리 시 메모리 누수 주의

9. 추천하는 개발 순서

  1. 기본 윈도우 구성
  2. 위젯 배치
  3. 이벤트 핸들러 구현
  4. 기능 테스트
  5. 스타일링
  6. 예외 처리

10. 마무리

  • Tkinter는 간단한 GUI 앱 개발에 적합
  • 복잡한 애플리케이션은 PyQt나 wxPython 고려
  • 지속적인 연습과 실습이 중요

TOP

Designed by 티스토리