0% found this document useful (0 votes)
11 views

REMINDER-APP-PYTHON

Uploaded by

vilyxu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
11 views

REMINDER-APP-PYTHON

Uploaded by

vilyxu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

import time

from datetime import datetime, timedelta


import threading
import json

class Reminder:
"""
Represents a single reminder with details like title, description, and time.
"""
def __init__(self, title, description, remind_at, repeat_interval=None):
self.title = title
self.description = description
self.remind_at = remind_at
self.repeat_interval = repeat_interval # in seconds, None if no repeat
self.completed = False

def to_dict(self):
return {
"title": self.title,
"description": self.description,
"remind_at": self.remind_at.strftime("%Y-%m-%d %H:%M:%S"),
"repeat_interval": self.repeat_interval,
"completed": self.completed
}

@staticmethod
def from_dict(data):
remind_at = datetime.strptime(data["remind_at"], "%Y-%m-%d %H:%M:%S")
return Reminder(
title=data["title"],
description=data["description"],
remind_at=remind_at,
repeat_interval=data["repeat_interval"],
)

def __str__(self):
repeat_info = f"Repeats every {self.repeat_interval} seconds" if
self.repeat_interval else "One-time reminder"
return (f"Title: {self.title}\n"
f"Description: {self.description}\n"
f"Remind At: {self.remind_at}\n"
f"Status: {'Completed' if self.completed else 'Pending'}\n"
f"{repeat_info}\n")

class ReminderManager:
"""
Manages multiple reminders, including scheduling, saving, and loading.
"""
def __init__(self):
self.reminders = []
self.running = True

def add_reminder(self, reminder):


self.reminders.append(reminder)
print(f"Reminder '{reminder.title}' added successfully.")

def delete_reminder(self, title):


for reminder in self.reminders:
if reminder.title.lower() == title.lower():
self.reminders.remove(reminder)
print(f"Reminder '{title}' deleted successfully.")
return
print(f"Reminder '{title}' not found.")

def list_reminders(self):
if not self.reminders:
print("No reminders to display.")
else:
for idx, reminder in enumerate(self.reminders, start=1):
print(f"--- Reminder {idx} ---")
print(reminder)

def save_reminders(self, filename="reminders.json"):


try:
data = [reminder.to_dict() for reminder in self.reminders]
with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, indent=4)
print(f"Reminders saved to '{filename}'.")
except Exception as e:
print(f"Failed to save reminders: {e}")

def load_reminders(self, filename="reminders.json"):


try:
with open(filename, "r", encoding="utf-8") as f:
data = json.load(f)
self.reminders = [Reminder.from_dict(item) for item in data]
print(f"Reminders loaded from '{filename}'.")
except FileNotFoundError:
print(f"File '{filename}' not found. Starting with an empty reminder
list.")
except Exception as e:
print(f"Failed to load reminders: {e}")

def check_and_trigger_reminders(self):
"""
Continuously checks and triggers reminders when their time arrives.
"""
while self.running:
now = datetime.now()
for reminder in self.reminders:
if not reminder.completed and now >= reminder.remind_at:
print(f"\nReminder Triggered: {reminder.title}\nDescription:
{reminder.description}\nTime: {reminder.remind_at}\n")
reminder.completed = True
if reminder.repeat_interval:
reminder.remind_at +=
timedelta(seconds=reminder.repeat_interval)
reminder.completed = False
time.sleep(1)

def stop(self):
self.running = False

class ReminderApp:
"""
Provides a user interface to interact with the ReminderManager.
"""
def __init__(self):
self.manager = ReminderManager()
self.checker_thread =
threading.Thread(target=self.manager.check_and_trigger_reminders, daemon=True)
self.checker_thread.start()

def display_menu(self):
print("\n--- Reminder App Menu ---")
print("1. Add a New Reminder")
print("2. List All Reminders")
print("3. Delete a Reminder")
print("4. Save Reminders to File")
print("5. Load Reminders from File")
print("6. Exit")

def get_reminder_details(self):
title = input("Enter the title of the reminder: ").strip()
description = input("Enter the description: ").strip()
remind_at_str = input("Enter the reminder time (YYYY-MM-DD HH:MM:SS):
").strip()
repeat_choice = input("Do you want this reminder to repeat? (yes/no):
").strip().lower()
repeat_interval = None

if repeat_choice == "yes":
repeat_interval = int(input("Enter the repeat interval in seconds:
").strip())

remind_at = datetime.strptime(remind_at_str, "%Y-%m-%d %H:%M:%S")

return Reminder(title, description, remind_at, repeat_interval)

def run(self):
print("Welcome to the Reminder App!")

while True:
self.display_menu()
choice = input("Enter your choice: ").strip()

if choice == "1":
print("\n--- Add a New Reminder ---")
try:
reminder = self.get_reminder_details()
self.manager.add_reminder(reminder)
except ValueError:
print("Invalid date format. Please try again.")

elif choice == "2":


print("\n--- List All Reminders ---")
self.manager.list_reminders()

elif choice == "3":


print("\n--- Delete a Reminder ---")
title = input("Enter the title of the reminder to delete:
").strip()
self.manager.delete_reminder(title)

elif choice == "4":


print("\n--- Save Reminders to File ---")
self.manager.save_reminders()
elif choice == "5":
print("\n--- Load Reminders from File ---")
self.manager.load_reminders()

elif choice == "6":


print("Exiting the Reminder App. Goodbye!")
self.manager.stop()
self.checker_thread.join()
break

else:
print("Invalid choice. Please try again.")

if __name__ == "__main__":
app = ReminderApp()
app.run()

You might also like