DEV Community

Cover image for Calendar Maker
Scott Gordon
Scott Gordon

Posted on

3

Calendar Maker

Console Output

GitHub Repo

# calendar_maker.py
#   This program lets a user create a monthly calendar, saved to a text file
#   ready to print.
# by: Scott Gordon

import datetime

DAYS = ("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday,")
MONTHS = (
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December",
)

print("***** Calendar Maker *****")

# Loop to get the year from user
while True:
    print("Enter the year for the calendar:")
    response = input("> ")

    if response.isdecimal() and int(response) > 0:
        year = int(response)
        break

    print("Please enter a numeric year, i.e. 2028.")
    continue

# Loop to get the month from user
while True:
    print("Enter the month for the calendar, 1-12:")
    response = input("> ")

    if not response.isdecimal():
        print("Please enter a numeric month, i.e. 1 for January.")
        continue

    month = int(response)
    if 1 <= month <= 12:
        break

    print("Please enter a number from 1 to 12.")


def get_calendar_for(year, month):
    cal_text = ""

    # Add month and year to top of calendar.
    cal_text += (" " * 34) + MONTHS[month - 1] + " " + str(year) + "\n"

    # Add days of week labels to calendar.
    cal_text += """+----------+----------+----------+----------+----------+----------+----------+
|  Sunday  |  Monday  | Tuesday  |Wednesday | Thursday |  Friday  | Saturday |\n"""

    week_separator = ("+----------" * 7) + "+\n"
    blank_row = ("|          " * 7) + "|\n"

    # Get first date in month
    current_date = datetime.date(year, month, 1)

    # Roll back current_date until it's equal to Sunday.
    while current_date.weekday() != 6:
        current_date -= datetime.timedelta(days=1)

    while True:
        # Loop over each week in month
        cal_text += week_separator

        # Create row with day number labels
        day_number_row = ""
        for i in range(7):
            day_number_label = str(current_date.day).rjust(2)
            day_number_row += "|" + day_number_label + (" " * 8)
            # Go to next day
            current_date += datetime.timedelta(days=1)
        day_number_row += "|\n"

        # Add day number row and 3 black rows to calender text.
        cal_text += day_number_row
        for i in range(3):
            cal_text += blank_row

        # Check if done with month
        if current_date.month != month:
            break

    # Add horizontal line to bottom
    cal_text += week_separator
    return cal_text


cal_text = get_calendar_for(year, month)
print(cal_text)

# Save to text file
calendar_file_name = f"calendar_{year}_{month}.txt"
with open(calendar_file_name, "w") as file_obj:
    file_obj.write(cal_text)

print("Saved to " + calendar_file_name)

Enter fullscreen mode Exit fullscreen mode

Verify my Python Skills

Photo by Eric Rothermel on Unsplash

Image of Datadog

Master Mobile Monitoring for iOS Apps

Monitor your app’s health with real-time insights into crash-free rates, start times, and more. Optimize performance and prevent user churn by addressing critical issues like app hangs, and ANRs. Learn how to keep your iOS app running smoothly across all devices by downloading this eBook.

Get The eBook

Top comments (0)

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay