본문 바로가기

강의/Python 기초

Chapter 23. GUI 달력 프로그램 만들기

반응형

월별 일정 확인 프로그램

이번 시간에는 파이썬으로 GUI 달력 프로그램을 만들어 보겠습니다.

GUI는 글자만 나오는 검은 화면이 아니라, 버튼과 입력창이 있는 프로그램 화면을 말합니다.

이번 프로그램에서는 원하는 연도와 월을 입력하면 달력이 나오고, 날짜별로 일정도 등록할 수 있습니다.


1. 완성 프로그램 기능

이번에 만들 프로그램 기능은 다음과 같습니다.

  • 연도 입력하기
  • 월 입력하기
  • 월별 달력 보기
  • 날짜별 일정 등록하기
  • 등록된 일정 확인하기
  • 버튼으로 실행하기

2. 전체 소스 코드

import tkinter as tk
from tkinter import messagebox
import calendar

# 일정 저장용 딕셔너리
# 예: {"2026-06-13": "파이썬 공부"}
schedules = {}

def show_calendar():
    try:
        year = int(year_entry.get())
        month = int(month_entry.get())

        if month < 1 or month > 12:
            messagebox.showwarning("입력 오류", "월은 1부터 12까지 입력해야 합니다.")
            return

        # 달력 화면 지우기
        calendar_text.delete("1.0", tk.END)

        # 입력한 연도와 월의 달력 만들기
        cal = calendar.month(year, month)

        # 달력 화면에 출력하기
        calendar_text.insert(tk.END, cal)

        # 일정 목록 새로고침
        show_month_schedule(year, month)

    except ValueError:
        messagebox.showwarning("입력 오류", "연도와 월은 숫자로 입력해야 합니다.")

def add_schedule():
    try:
        year = int(year_entry.get())
        month = int(month_entry.get())
        day = int(day_entry.get())
        memo = memo_entry.get()

        if month < 1 or month > 12:
            messagebox.showwarning("입력 오류", "월은 1부터 12까지 입력해야 합니다.")
            return

        if day < 1 or day > 31:
            messagebox.showwarning("입력 오류", "일은 1부터 31까지 입력해야 합니다.")
            return

        if memo == "":
            messagebox.showwarning("입력 오류", "일정 내용을 입력하세요.")
            return

        # 날짜를 2026-06-13 형태로 만들기
        date = f"{year}-{str(month).zfill(2)}-{str(day).zfill(2)}"

        # 딕셔너리에 일정 저장
        schedules[date] = memo

        messagebox.showinfo("완료", "일정이 등록되었습니다.")

        # 입력창 비우기
        day_entry.delete(0, tk.END)
        memo_entry.delete(0, tk.END)

        # 달력과 일정 다시 보여주기
        show_calendar()

    except ValueError:
        messagebox.showwarning("입력 오류", "연도, 월, 일은 숫자로 입력해야 합니다.")

def show_month_schedule(year, month):
    # 일정 목록 지우기
    schedule_list.delete(0, tk.END)

    has_schedule = False

    for date, memo in schedules.items():
        date_year, date_month, date_day = date.split("-")

        if int(date_year) == year and int(date_month) == month:
            schedule_list.insert(tk.END, f"{date_day}일 : {memo}")
            has_schedule = True

    if not has_schedule:
        schedule_list.insert(tk.END, "등록된 일정이 없습니다.")

def delete_schedule():
    selected = schedule_list.curselection()

    if not selected:
        messagebox.showwarning("선택 오류", "삭제할 일정을 선택하세요.")
        return

    selected_text = schedule_list.get(selected[0])

    if selected_text == "등록된 일정이 없습니다.":
        return

    year = int(year_entry.get())
    month = int(month_entry.get())

    # 선택한 글자에서 날짜만 꺼내기
    day = selected_text.split("일")[0]

    date = f"{year}-{str(month).zfill(2)}-{str(day).zfill(2)}"

    if date in schedules:
        del schedules[date]
        messagebox.showinfo("완료", "일정이 삭제되었습니다.")
        show_calendar()

# 윈도우 창 만들기
window = tk.Tk()
window.title("GUI 달력 프로그램")
window.geometry("520x600")
window.resizable(False, False)

# 제목
title_label = tk.Label(
    window,
    text="GUI 달력 프로그램",
    font=("맑은 고딕", 18, "bold")
)
title_label.pack(pady=10)

# 연도, 월 입력 영역
input_frame = tk.Frame(window)
input_frame.pack(pady=5)

tk.Label(input_frame, text="연도").grid(row=0, column=0, padx=5)
year_entry = tk.Entry(input_frame, width=10)
year_entry.grid(row=0, column=1, padx=5)
year_entry.insert(0, "2026")

tk.Label(input_frame, text="월").grid(row=0, column=2, padx=5)
month_entry = tk.Entry(input_frame, width=5)
month_entry.grid(row=0, column=3, padx=5)
month_entry.insert(0, "6")

show_button = tk.Button(
    input_frame,
    text="달력 보기",
    command=show_calendar
)
show_button.grid(row=0, column=4, padx=5)

# 달력 출력 영역
calendar_text = tk.Text(
    window,
    width=45,
    height=10,
    font=("Consolas", 12)
)
calendar_text.pack(pady=10)

# 일정 입력 영역
schedule_frame = tk.Frame(window)
schedule_frame.pack(pady=5)

tk.Label(schedule_frame, text="일").grid(row=0, column=0, padx=5)
day_entry = tk.Entry(schedule_frame, width=5)
day_entry.grid(row=0, column=1, padx=5)

tk.Label(schedule_frame, text="일정").grid(row=0, column=2, padx=5)
memo_entry = tk.Entry(schedule_frame, width=25)
memo_entry.grid(row=0, column=3, padx=5)

add_button = tk.Button(
    schedule_frame,
    text="일정 등록",
    command=add_schedule
)
add_button.grid(row=0, column=4, padx=5)

# 일정 목록 제목
schedule_title = tk.Label(
    window,
    text="등록된 일정",
    font=("맑은 고딕", 12, "bold")
)
schedule_title.pack(pady=5)

# 일정 목록
schedule_list = tk.Listbox(
    window,
    width=45,
    height=8
)
schedule_list.pack(pady=5)

# 삭제 버튼
delete_button = tk.Button(
    window,
    text="선택한 일정 삭제",
    command=delete_schedule
)
delete_button.pack(pady=5)

# 처음 실행할 때 달력 보여주기
show_calendar()

# 프로그램 실행
window.mainloop()

3. 실행 방법

  1. 파이썬 파일을 만듭니다.
chapter23_calendar_gui.py
  1. 위 코드를 복사해서 붙여 넣습니다.
  2. 실행 버튼을 누르거나 터미널에서 실행합니다.
python chapter23_calendar_gui.py

4. 실행 화면 설명

프로그램을 실행하면 작은 창이 열립니다.

화면에는 다음 내용이 보입니다.

  • 연도 입력창
  • 월 입력창
  • 달력 보기 버튼
  • 달력 출력 화면
  • 일정 입력창
  • 일정 등록 버튼
  • 등록된 일정 목록
  • 일정 삭제 버튼

5. 코드 설명

1) tkinter 불러오기

import tkinter as tk
from tkinter import messagebox

tkinter는 파이썬에서 GUI 프로그램을 만들 때 사용하는 기본 도구입니다.

버튼, 입력창, 글자, 목록 같은 화면 요소를 만들 수 있습니다.

messagebox는 알림창을 보여줄 때 사용합니다.


2) calendar 모듈 불러오기

import calendar

calendar는 달력을 만들어 주는 파이썬 기본 모듈입니다.

직접 달력 모양을 만들지 않아도 됩니다.


3) 일정 저장 공간 만들기

schedules = {}

일정을 저장하기 위해 딕셔너리를 사용합니다.

딕셔너리는 이름표가 붙은 상자라고 생각하면 됩니다.

예를 들면 이렇게 저장됩니다.

{
    "2026-06-13": "파이썬 공부"
}

뜻은 2026년 6월 13일에 “파이썬 공부” 일정이 있다는 의미입니다.


4) 달력 보여주기 함수

def show_calendar():

이 함수는 사용자가 입력한 연도와 월을 읽어 옵니다.

그리고 해당 월의 달력을 화면에 보여줍니다.

cal = calendar.month(year, month)
calendar_text.insert(tk.END, cal)

calendar.month(year, month)는 입력한 연도와 월의 달력을 글자로 만들어 줍니다.

그 달력을 Text 화면에 넣어서 보여줍니다.


5) 일정 등록 함수

def add_schedule():

이 함수는 사용자가 입력한 날짜와 일정 내용을 가져옵니다.

date = f"{year}-{str(month).zfill(2)}-{str(day).zfill(2)}"
schedules[date] = memo

날짜는 2026-06-13 같은 모양으로 저장합니다.

zfill(2)는 숫자를 두 자리로 맞춰 줍니다.

예를 들어 6은 06으로 바뀝니다.


6) 월별 일정 보여주기 함수

def show_month_schedule(year, month):

이 함수는 저장된 일정 중에서 현재 보고 있는 연도와 월에 맞는 일정만 찾아서 보여줍니다.

예를 들어 2026년 6월 달력을 보고 있다면 2026년 6월 일정만 보여줍니다.


7) 일정 삭제 함수

def delete_schedule():

이 함수는 목록에서 선택한 일정을 삭제합니다.

일정을 잘못 입력했을 때 사용할 수 있습니다.


8) GUI 창 만들기

window = tk.Tk()
window.title("GUI 달력 프로그램")
window.geometry("520x600")

프로그램 창을 만듭니다.

창 제목은 “GUI 달력 프로그램”이고, 크기는 가로 520, 세로 600입니다.


9) 버튼 만들기

show_button = tk.Button(
    input_frame,
    text="달력 보기",
    command=show_calendar
)

버튼을 만들 때는 Button을 사용합니다.

command=show_calendar는 버튼을 눌렀을 때 show_calendar() 함수가 실행된다는 뜻입니다.


10) 프로그램 실행하기

window.mainloop()

이 코드는 GUI 프로그램을 계속 실행하게 해 줍니다.

이 코드가 있어야 창이 바로 닫히지 않습니다.


 

6. 이번 프로그램에서 배운 내용

이번 예제에서는 다음 내용을 배웠습니다.

  • GUI 창 만들기
  • 입력창 만들기
  • 버튼 만들기
  • 달력 출력하기
  • 일정 등록하기
  • 일정 삭제하기
  • 딕셔너리에 데이터 저장하기
  • 함수로 코드 정리하기
  • 오류가 나지 않도록 입력값 확인하기

7. 더 발전시키기

이 프로그램은 아직 아주 간단한 일정 관리 프로그램입니다.

나중에는 다음 기능도 추가할 수 있습니다.

  • 일정 수정 기능
  • 일정 파일 저장 기능
  • 프로그램을 껐다 켜도 일정 불러오기
  • 오늘 날짜 표시하기
  • 토요일, 일요일 색 다르게 표시하기
  • 예쁜 달력 디자인 만들기

마무리

이번 시간에는 파이썬 tkinter와 calendar 모듈을 사용해서 GUI 달력 프로그램을 만들어 보았습니다.

처음에는 버튼과 입력창이 많아 보여서 어려워 보일 수 있습니다.

하지만 하나씩 살펴보면 모두 간단한 역할을 합니다.

입력창은 값을 받고, 버튼은 함수를 실행하고, 달력 화면은 결과를 보여줍니다.

이렇게 작은 기능들을 연결하면 나만의 일정 관리 프로그램을 만들 수 있습니다.


그림판 만들기

반응형