파이썬을 배우면서 GUI 프로그램을 만들어보고 싶은 분들을 위해,
달력에 날짜별 메모를 저장하고, 시각적으로 관리할 수 있는 간단한 프로그램을 소개할게요.
이 글은 초보자도 쉽게 이해할 수 있도록 구성되었고, 필요한 코드를 함께 설명해 드릴게요.
목차
1. 프로그램 소개
이번에 만들어볼 프로그램은 날짜별로 메모를 저장할 수 있고,
달력에서 한눈에 메모가 있는 날짜를 확인할 수 있는 GUI 기반 메모장입니다.
GUI는 tkinter라는 기본 내장 라이브러리를 사용하고,
달력은 tkcalendar라는 외부 모듈을 설치해서 구성합니다.
2. 만들고자 하는 기능
날짜 클릭 → 메모 입력 → 저장
달력에 메모가 있는 날짜 시각적으로 표시
기존 메모 수정 및 삭제 가능
전체할 일 목록을 리스트박스로 한눈에 보기
3. 사용된 모듈 소개
tkinter: GUI 창, 버튼, 텍스트박스 등을 만들기 위한 표준 라이브러리
tkcalendar: 달력 위젯을 제공해 주는 외부 모듈. pip install tkcalendar로 설치 가능
datetime: 날짜 정보를 처리하기 위한 기본 모듈
json: 메모 데이터를 파일로 저장하고 불러오기 위해 사용
os: 파일 존재 여부를 확인하기 위해 사용
4. 전체 코드
from tkinter import *
from tkcalendar import Calendar
from datetime import date
import json
import os
SAVE_FILE = "todos.json"
def load_todos():
if os.path.exists(SAVE_FILE):
with open(SAVE_FILE, "r", encoding="utf-8") as f:
return json.load(f)
return {}
def save_todos():
with open(SAVE_FILE, "w", encoding="utf-8") as f:
json.dump(todos, f, ensure_ascii=False, indent=4)
def update_marks():
cal.calevent_remove('all')
for date_str in todos:
y, m, d = map(int, date_str.split('-'))
cal.calevent_create(date(y, m, d), '', "todo")
def on_date_select(event):
selected = cal.selection_get()
date_str = selected.strftime("%Y-%m-%d")
memo_box.delete("1.0", END)
if date_str in todos:
memo_box.insert(END, todos[date_str])
date_label.config(text=f"{date_str}의 할 일")
def save_todo():
selected = cal.selection_get()
date_str = selected.strftime("%Y-%m-%d")
content = memo_box.get("1.0", END).strip()
if content:
todos[date_str] = content
elif date_str in todos:
del todos[date_str]
save_todos()
update_marks()
update_listbox()
def update_listbox():
listbox.delete(0, END)
for key in sorted(todos.keys()):
listbox.insert(END, f"{key}: {todos[key]}")
root = Tk()
root.title("할 일 달력 프로그램")
root.geometry("900x600")
cal = Calendar(root, selectmode='day', date_pattern='yyyy-mm-dd')
cal.place(x=20, y=20, width=400, height=300)
cal.bind("<>", on_date_select)
date_label = Label(root, text="날짜를 선택해주세요", font=("Arial", 14))
date_label.place(x=450, y=20)
memo_box = Text(root, width=40, height=10, font=("Arial", 12))
memo_box.place(x=450, y=60)
save_btn = Button(root, text="저장", command=save_todo, font=("Arial", 12))
save_btn.place(x=450, y=260)
listbox_label = Label(root, text="전체 할 일 목록", font=("Arial", 12, "bold"))
listbox_label.place(x=20, y=340)
listbox = Listbox(root, width=80, height=8, font=("Arial", 11))
listbox.place(x=20, y=370)
todos = load_todos()
update_marks()
update_listbox()
root.mainloop()
5. 코드 설명과 실행 화면
1) 모듈 임포트
필요한 라이브러리를 불러오는 부분입니다. 외부 모듈인 tkcalendar는 pip로 설치가 필요합니다.
2) SAVE_FILE 변수
JSON 파일 이름을 저장한 전역 상수입니다. 현재 작업 폴더에 todos.json이라는 이름으로 저장됩니다.
3) load_todos 함수
파일이 존재할 경우 JSON 형식으로 데이터를 불러옵니다. 존재하지 않으면 빈 딕셔너리를 반환합니다.
4) save_todos 함수
현재 todos 데이터를 todos.json 파일에 저장합니다.
5) update_marks 함수
달력 위젯의 모든 이벤트를 지우고, 메모가 있는 날짜마다 새로운 이벤트를 생성합니다.
이벤트 태그 "todo"는 추후 색상 설정에도 활용할 수 있습니다.
6) on_date_select 함수
달력에서 날짜를 클릭했을 때 호출됩니다.
선택한 날짜의 메모를 텍스트 박스에 불러오고, 제목 레이블을 해당 날짜로 바꿉니다.
7) save_todo 함수
텍스트 박스 내용을 읽어와 현재 선택된 날짜에 저장하거나,
내용이 없으면 삭제합니다. 그리고 변경사항을 즉시 파일로 저장하고 화면을 갱신합니다.
8) update_listbox 함수
전체 todos 데이터를 날짜순으로 정렬해서 리스트 박스에 출력합니다.
9) 전역 변수 todos
todos = load_todos()를 통해 초기화되며, 각 함수에서 참조 및 수정이 가능한 전역 변수입니다.
실행화면
원하는 날짜를 클릭하고 오른쪽에 박스에 자유롭게 텍스트를 입력할 수 있습니다.
입력하게 되면 아래에 전체할 일 목록이 나옵니다.
또한 달력에서 할 일이 있는 날짜는 파란색으로 표시되도록 했습니다.
6. 확장 아이디어
하루에 여러 메모를 추가할 수 있도록 리스트 형태 저장 방식으로 개선
메모 완료 여부를 체크박스로 구현
오늘 할 일만 필터링해서 보여주는 기능
CSV 또는 Excel로 내보내기 기능
알림 기능 추가 (예: 특정 시간에 팝업 알림)
달력 이벤트 색상을 메모 중요도에 따라 다르게 표시
7. 마무리
pip install tkcalendar명령어로 외부 모듈을 먼저 설치해야 합니다.
파일 저장 방식으로 JSON을 사용해 프로그램을 종료해도 데이터가 유지됩니다.
tkinter에서 텍스트를 가져올 땐 get("1.0", END)처럼 인덱스를 사용해야 합니다. "1.0"은 첫 번째 줄의 첫 번째 문자입니다.
기본 저장 경로는 현재 실행 중인 폴더입니다. 다른 경로로 지정하고 싶다면 os.path.join()을 사용하는 것이 좋습니다.
메모가 비어 있을 경우 자동 삭제되므로, 삭제 기능도 자연스럽게 포함되어 있습니다.
이렇게 간단한 일정 관리 프로그램을 직접 만들면서 GUI 구성, 이벤트 처리, 파일 저장 방식,
그리고 JSON 데이터 구조까지 배울 수 있어요.
초보자라면 이 예제를 통해 자신만의 일정 관리 도구를 만들어보며 실력을 키워보세요!
'개발 & 코딩' 카테고리의 다른 글
파이썬으로 메이플스토리 보스 수익 계산기 만들어보기 (25년 7월) (3) | 2025.07.04 |
---|---|
파이썬 for문과 리스트 기초부터 예제까지 (0) | 2025.06.22 |
파이썬 if문과 while문 기초 및 실습 예제 (0) | 2025.06.21 |
파이썬으로 파일 자동 분류 프로그램 만들기 (1) | 2025.06.20 |
Python OCR 이미지 텍스트 인식 성능 알아보기 (0) | 2025.06.19 |