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. 추천하는 개발 순서
- 기본 윈도우 구성
- 위젯 배치
- 이벤트 핸들러 구현
- 기능 테스트
- 스타일링
- 예외 처리
10. 마무리
- Tkinter는 간단한 GUI 앱 개발에 적합
- 복잡한 애플리케이션은 PyQt나 wxPython 고려
- 지속적인 연습과 실습이 중요