3.7.4 미니 프로젝트: CSV 데이터를 GUI로 띄우기
학습목표
지금까지 배운 파이썬의 핵심 3대장 기술을 하나로 융합하는 최종 보스급 미니 프로젝트입니다.
1) 파일 I/O (open()) 기술로 sales.csv 파일을 읽어 리스트로 가공하고,
2) 데이터 시각화 (Matplotlib) 기술로 차트를 그려낸 다음,
3) 이 모든 결과를 GUI 프로그래밍 (Tkinter) 창 위에 버튼과 함께 아름답게 띄워 넣는 완벽한 통합 애플리케이션을 완성해 봅니다.
💡 TL;DR (1분 핵심 요약): 3종 신기의 결합
- 순수 파이썬의 검은색 터미널 창을 벗어나, “결과 보기” 웹 버튼이 달린 번듯한 윈도우 UI(Tkinter)를 먼저 만듭니다.
- 사용자가 버튼을 누르면(
command=), 숨겨두었던 데이터 분석 함수가 발동합니다. - 함수는 하드디스크의
.csv파일을 열고 파싱하여Matplotlib으로 차트를 생성해 화면에 팝업시킵니다!
1. 프로젝트 아키텍처 (어떻게 합칠 것인가?)
자바(Java)였다면 이 세 가지(버튼UI, 파일읽기, 차트그리기)를 합치기 위해 수십 개의 클래스 파일과 아키텍처 설계가 필요했을 것입니다. 하지만 파이썬에서는 이 모든 것이 단일 .py 파일 안에서 함수 블록(def) 하나로 우아하게 통일됩니다.
우리는 윈도우 창(Tk())을 먼저 하나 띄워놓고, 그 안에 커다란 버튼을 하나 박아둘 것입니다. 그리고 이 버튼의 전선(command)을 방금 전 데이터 분석 챕터(06_data_viz_prep)에서 배웠던 차트 생성 함수에 곧바로 연결해버리면 끝입니다!
2. 통합 애플리케이션 코드
🚨 (필수) 패키지 설치 안내 파이썬 기본 내장 모듈인
tkinter와 달리,matplotlib은 외부 시각화 라이브러리입니다. 코드를 실행하기 전 VS Code 하단 터미널을 열고 아래 명령어로 패키지를 먼저 설치해 주셔야 합니다.python -m pip install matplotlib
이 코드를 실행하려면 sales.csv 파일이 같은 폴더에 있어야 하며, 오류가 날 경우 위 명령어로 matplotlib을 설치해 주세요.
import tkinter as tk
import matplotlib.pyplot as plt
import os
# ---------------------------------------------------------
# 1. 핵심 비즈니스 로직 (데이터 읽고 차트 그리기 함수)
# ---------------------------------------------------------
def analyze_and_show_chart():
days = []
sales = []
# 현재 파일 위치에서 sales.csv 찾기 (파일 I/O)
current_dir = os.path.dirname(os.path.abspath(__file__))
csv_path = os.path.join(current_dir, "sales.csv")
try:
with open(csv_path, "r", encoding="utf-8") as f:
f.readline() # 헤더 버리기
for line in f:
row = line.strip().split(',')
days.append(int(row[0])) # [1, 2, 3...]
sales.append(int(row[1])) # [100, 110, 105...]
except FileNotFoundError:
# 파일이 없으면 라벨에 에러 메시지를 띄우는 GUI 피드백!
lbl_status.config(text="🚨 에러: sales.csv 파일을 찾을 수 없습니다!", fg="red")
return # 함수 강제 종료
# 여기까지 무사히 왔다면 차트 그리기 (Matplotlib)
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot(days, sales, marker='o', color='blue', linestyle='-')
ax.set_title("Sales Analysis Data")
ax.set_xlabel("Day")
ax.set_ylabel("Sales ($)")
# GUI 라벨 업데이트 및 차트 팝업 띄우기
lbl_status.config(text="✅ 분석 완료! 차트가 별도 창으로 생성되었습니다.", fg="blue")
plt.show()
# ---------------------------------------------------------
# 2. GUI 화면 설계 로직 (Tkinter 껍데기)
# ---------------------------------------------------------
root = tk.Tk()
root.title("내 인생 첫 데이터 분석 앱")
root.geometry("400x200") # 가로상자 크게
# 타이틀 라벨 (팩 레이아웃으로 중앙 정렬)
lbl_title = tk.Label(root, text="🚀 파이썬 원클릭 데이터 분석기", font=("Arial", 16, "bold"))
lbl_title.pack(pady=(20, 10))
# 상태 알림 라벨 (이벤트가 터지면 글씨가 바뀔 곳)
lbl_status = tk.Label(root, text="버튼을 눌러 분석을 시작하세요.", font=("Arial", 10))
lbl_status.pack(pady=5)
# 실행 버튼 (command에 위의 거대한 분석 함수를 장전!)
btn_run = tk.Button(root, text="📊 데이터 읽어오기 및 차트 보기",
font=("Arial", 12),
bg="#4CAF50", fg="white", # 버튼 색상 꾸미기
command=analyze_and_show_chart)
btn_run.pack(pady=20)
# 심장 박동(무한 대기 루프) 시작
root.mainloop()
3. 코드 해부: 파이썬의 무서운 실전 압축력
위 코드는 불과 40여 줄에 불과하지만, 현업에서 쓰이는 “데이터 파이프라인 + 프론트엔드 버튼 + 백엔드 처리(시각화)” 아키텍처의 필수 요소를 모두 갖추고 있습니다.
- UI 렌더링:
tk.Tk()와pack()을 통해 클라이언트 모니터에 시각적인 조종석을 제공합니다. - 예외 처리 연동: 파일이 없을 경우 무식하게 터미널에 에러를 뱉고 뻗는 것이 아니라,
try-except블록을 통과하면서lbl_status.config()라는 GUI 함수를 조종해 사용자에게 시각적으로 “🚨 에러가 났습니다”라고 예쁘게 알려줍니다. (완전한 상용 프로그램의 디테일) - 이벤트 모듈화:
command=analyze_and_show_chart단 한 줄로, 버튼 위젯이라는 빈 껍데기가 거대한 데이터 분석 머신으로 탈바꿈했습니다.
☕ Java vs 🐍 Python 스나이퍼 대결
자바 개발자라면 위 40줄짜리 파이썬 코드를 자바로 구현하기 위해 머릿속에 수많은 패키지 분리를 상상했을 것입니다.
Swing/JavaFX로 UI 프레임워크 객체 작성 (100줄 이상)- 사용자 버튼 클릭을 감지하는
ActionListener와 쓰레드 분리 설계 FileReader,BufferedReader로 CSV 파싱 객체 구현 (50줄 구조)JFreeChart등에 데이터셋 주입하기 위해while루프 돌리며 DTO 변환 (50줄 구조)- 결과: 자바로는 파일 3~4개가 쪼개어지고 총 300줄이 넘어가는 숨 막히는 프로젝트가 되어버리지만, 파이썬은 단일 흐름의 절차지향적 코딩으로 프론트와 백엔드 로직이 40줄에 우아하게 결합됩니다.
🎧 Vibe Coding
🗣️ 학생 프롬프트 (AI에게 이렇게 명령해 보세요): “파이썬
Tkinter를 써서 내가 방금 짠 데이터 분석 프로그램에 기능을 추가해줘! 지금은 버튼이 한 개인데, 이 버튼 옆에 텍스트 입력칸(Entry) 창을 하나 뚫어줘. 그리고 내가 거기에 ‘sales2.csv’ 처럼 어떤 파일 이름을 치고 분석 버튼을 누르면, 코드가 입력칸에서 그 이름을 읽어와서(get()) 그 이름에 맞는 파일 데이터를 분석하게 동적인 기능을 가진 GUI로 뜯어고쳐 줘.”
코딩 영단어 학습 📝
- Integration (인티그레이션): 통합, 결합. (따로따로 노는 A, B, C의 부품을 엮어 하나의 시스템으로 완성하는 것을 뜻합니다. 여기서는 GUI 인프라 위에서 파일 읽기와 그래프 그리기를 인티그레이션(통합)했습니다.)
- Pipeline (파이프라인): 정보 전달의 관. (원유를 나르는 송유관처럼, 하드디스크의 텍스트 한 줄이 코드를 타고 들어와 -> 리스트로 변형되고 -> 마지막엔 차트 이미지로 출력되는 이 일련의 컨베이어 벨트 처리 과정을 ‘데이터 파이프라인’이라 부릅니다.)
- Try / Except (트라이/익셉트): 예외 처리 덫. (파일이 없거나 데이터가 꼬여 프로그램이 강제 폭발하는 것을 막기 위해 쳐놓는 덫입니다. 에러가 나면 팅기지 않고 사용자의 화면 라벨을 예쁜 빨간 글씨로 바꿔주어 고객 경험(UX)을 극대화합니다.)