Activity Reminder App - Copy this React, Tailwind Component to your project
import-tkinter-as-tk-from-tkinter-import-messagebox,-ttk-from-plyer-import-notification-import-threading-import-time-import-json-import-os-from-tkcalendar-import-Calendar,-DateEntry-import-datetime-#-File-to-store-user-settings-and-reminders-DATA_FILE-=-"reminders_data.json"-class-ActivityReminderApp:-def-__init__(self,-root):-self.root-=-root-self.root.title("Activity-Reminder-App")-self.root.geometry("400x400")-#-Load-data-from-JSON-file-self.load_data()-#-Set-default-theme-self.current_theme-=-"Light"-#-Create-frames-self.frames-=-{-"home":-tk.Frame(root),-"settings":-tk.Frame(root),-"reminder_setup":-tk.Frame(root),-"activity_calendar":-tk.Frame(root),-}-#-Show-the-home-screen-initially-self.show_frame("home")-def-show_frame(self,-frame_name):-"""Show-a-specific-frame-and-hide-others."""-for-frame-in-self.frames.values():-frame.pack_forget()-#-Hide-all-frames-self.frames[frame_name].pack(fill="both",-expand=True)-#-Show-selected-frame-#-Apply-the-current-theme-to-the-frame-self.apply_theme(self.frames[frame_name])-if-frame_name-==-"home":-self.create_home_screen()-elif-frame_name-==-"reminder_setup":-self.create_reminder_setup_screen()-elif-frame_name-==-"settings":-self.create_settings_screen()-elif-frame_name-==-"activity_calendar":-self.create_activity_calendar_screen()-def-apply_theme(self,-frame):-"""Apply-the-current-theme-to-the-specified-frame."""-bg_color-=-"#ffffff"-if-self.current_theme-==-"Light"-else-"#2E2E2E"-fg_color-=-"#000000"-if-self.current_theme-==-"Light"-else-"#FFFFFF"-frame.configure(bg=bg_color)-for-widget-in-frame.winfo_children():-widget.configure(bg=bg_color,-fg=fg_color)-def-create_home_screen(self):-"""Create-the-home-screen-UI."""-tk.Label(self.frames["home"],-text="Activity-Reminder-App",-font=("Arial",-16)).pack(pady=10)-self.schedule_label-=-tk.Label(self.frames["home"],-text="Upcoming-Reminders:")-self.schedule_label.pack(pady=5)-#-Listbox-for-reminders-self.reminder_listbox-=-tk.Listbox(self.frames["home"])-self.reminder_listbox.pack(pady=10)-#-Populate-listbox-with-existing-reminders-for-reminder-in-self.reminders:-self.reminder_listbox.insert(tk.END,-reminder)-#-Quick-Actions-tk.Button(self.frames["home"],-text="Start-a-Break",-command=self.start_break).pack(pady=5)-tk.Button(self.frames["home"],-text="Add-Reminder",-command=lambda:-self.show_frame("reminder_setup")).pack(pady=5)-tk.Button(self.frames["home"],-text="Settings",-command=lambda:-self.show_frame("settings")).pack(pady=5)-tk.Button(self.frames["home"],-text="View-Activity-Calendar",-command=lambda:-self.show_frame("activity_calendar")).pack(pady=5)-def-start_break(self):-"""Start-a-break-reminder."""-break_duration-=-5-#-Duration-of-break-in-minutes-messagebox.showinfo("Break-Reminder",-f"Take-a-break-for-{break_duration}-minutes!")-threading.Thread(target=self.break_timer,-args=(break_duration,)).start()-def-break_timer(self,-duration):-"""Timer-for-the-break."""-time.sleep(duration-*-60)-#-Convert-minutes-to-seconds-self.send_notification("Break-Over!",-"Time-to-get-back-to-work!")-def-create_reminder_setup_screen(self):-"""Create-the-reminder-setup-screen-UI."""-tk.Label(self.frames["reminder_setup"],-text="Set-Reminder",-font=("Arial",-16)).pack(pady=10)-tk.Label(self.frames["reminder_setup"],-text="Select-Date:").pack(pady=5)-self.calendar-=-Calendar(self.frames["reminder_setup"])-self.calendar.pack(pady=5)-tk.Label(self.frames["reminder_setup"],-text="Interval-(minutes):").pack(pady=5)-self.interval_entry-=-tk.Entry(self.frames["reminder_setup"])-self.interval_entry.pack(pady=5)-tk.Label(self.frames["reminder_setup"],-text="Choose-Activity:").pack(pady=5)-self.activities-=-["Stretch",-"Hydrate",-"Move-Around",-"Eye-Rest"]-self.selected_activity-=-tk.StringVar(value=self.activities[0])-self.activity_menu-=-tk.OptionMenu(self.frames["reminder_setup"],-self.selected_activity,-*self.activities)-self.activity_menu.pack(pady=5)-tk.Button(self.frames["reminder_setup"],-text="Save-Reminder",-command=self.save_reminder).pack(pady=10)-tk.Button(self.frames["reminder_setup"],-text="Back-to-Home",-command=lambda:-self.show_frame("home")).pack(pady=5)-def-save_reminder(self):-"""Save-the-new-reminder."""-try:-date-=-self.calendar.get_date()-interval-=-int(self.interval_entry.get())-*-60-#-Convert-minutes-to-seconds-activity-=-self.selected_activity.get()-reminder_text-=-f"{date}---{activity}-every-{self.interval_entry.get()}-minutes"-self.reminders.append(reminder_text)-self.reminder_listbox.insert(tk.END,-reminder_text)-#-Start-reminders-in-a-separate-thread-threading.Thread(target=self.start_reminders,-args=(activity,-interval)).start()-#-Save-reminders-to-file-self.save_data()-#-Log-active-day-self.log_active_day()-#-Check-for-consecutive-active-days-and-notify-if-the-badge-is-earned-if-self.check_consecutive_days():-messagebox.showinfo("Congratulations!",-"You-have-earned-a-badge-for-5-consecutive-active-days!")-messagebox.showinfo("Success",-f"Reminder-set-for-{activity}-on-{date}-every-{self.interval_entry.get()}-minutes.")-except-ValueError:-messagebox.showerror("Input-Error",-"Please-enter-a-valid-number-for-interval.")-def-log_active_day(self):-"""Log-the-current-day-as-an-active-day."""-today-=-datetime.date.today().isoformat()-if-today-not-in-self.active_days:-self.active_days.append(today)-self.save_data()-#-Save-active-days-def-check_consecutive_days(self):-"""Check-if-there-are-5-consecutive-active-days."""-active_dates-=-[datetime.datetime.strptime(day,-'%Y-%m-%d')-for-day-in-self.active_days]-active_dates.sort()-consecutive_count-=-1-for-i-in-range(1,-len(active_dates)):-if-(active_dates[i]---active_dates[i---1]).days-==-1:-consecutive_count-+=-1-if-consecutive_count->=-5:-return-True-else:-consecutive_count-=-1-#-Reset-count-return-False-def-start_reminders(self,-activity,-interval):-"""Start-sending-reminders-at-regular-intervals."""-while-True:-time.sleep(interval)-self.send_notification("Activity-Reminder!",-f"It's-time-to-{activity}!")-def-send_notification(self,-title,-message):-"""Send-a-desktop-notification."""-notification.notify(-title=title,-message=message,-timeout=10-)-def-create_settings_screen(self):-"""Create-the-settings-screen-UI."""-tk.Label(self.frames["settings"],-text="Settings",-font=("Arial",-16)).pack(pady=10)-tk.Label(self.frames["settings"],-text="Notification-Preferences:").pack(pady=5)-self.notifications_enabled-=-tk.BooleanVar(value=True)-tk.Checkbutton(self.frames["settings"],-text="Enable-Notifications",-variable=self.notifications_enabled).pack(pady=5)-tk.Label(self.frames["settings"],-text="Theme-Selection:").pack(pady=5)-self.theme_var-=-tk.StringVar(value="Light")-self.theme_menu-=-tk.OptionMenu(self.frames["settings"],-self.theme_var,-"Light",-"Dark",-command=self.change_theme)-self.theme_menu.pack(pady=5)-tk.Button(self.frames["settings"],-text="Save-Settings",-command=self.save_settings).pack(pady=10)-tk.Button(self.frames["settings"],-text="Back-to-Home",-command=lambda:-self.show_frame("home")).pack(pady=5)-def-change_theme(self,-theme):-"""Change-the-theme-of-the-application."""-self.current_theme-=-theme-for-frame-in-self.frames.values():-self.apply_theme(frame)-def-save_settings(self):-"""Save-user-settings."""-notification_state-=-"enabled"-if-self.notifications_enabled.get()-else-"disabled"-messagebox.showinfo("Settings-Saved",-f"Notifications-are-{notification_state}-and-theme-set-to-{self.theme_var.get()}.")-def-create_activity_calendar_screen(self):-"""Create-the-activity-calendar-screen-UI."""-tk.Label(self.frames["activity_calendar"],-text="Active-Days-Calendar",-font=("Arial",-16)).pack(pady=10)-self.calendar_widget-=-Calendar(self.frames["activity_calendar"],-selectmode="none",-date_pattern="yyyy-mm-dd")-self.calendar_widget.pack(pady=10)-#-Highlight-active-and-inactive-days-for-day-in-self.active_days:-self.calendar_widget.calevent_create(day,-'Active',-'active')-#-Fetch-all-days-in-the-current-month-to-find-inactive-days-today-=-datetime.date.today()-month_days-=-[today.replace(day=i-+-1)-for-i-in-range((today.replace(day=28)-+-datetime.timedelta(days=4)).day)]-#-Mark-inactive-days-in-the-current-month-for-day-in-month_days:-if-day.isoformat()-not-in-self.active_days:-self.calendar_widget.calevent_create(day,-'Inactive',-'inactive')-#-Set-colors-for-events-self.calendar_widget.tag_config('active',-background='green',-foreground='white')-self.calendar_widget.tag_config('inactive',-background='red',-foreground='white')-tk.Button(self.frames["activity_calendar"],-text="Back-to-Home",-command=lambda:-self.show_frame("home")).pack(pady=10)-def-load_data(self):-"""Load-reminders-and-active-days-from-JSON-file."""-if-os.path.exists(DATA_FILE):-with-open(DATA_FILE,-"r")-as-f:-data-=-json.load(f)-self.reminders-=-data.get("reminders",-[])-self.active_days-=-data.get("active_days",-[])-else:-self.reminders-=-[]-self.active_days-=-[]-def-save_data(self):-"""Save-reminders-and-active-days-to-JSON-file."""-with-open(DATA_FILE,-"w")-as-f:-json.dump({"reminders":-self.reminders,-"active_days":-self.active_days},-f)-#-Create-the-main-application-window-root-=-tk.Tk()-app-=-ActivityReminderApp(root)-root.mainloop()-give-ui-images-for-this
