0

import tkinter as tk
import time
import datetime
import pytz
from playsound import playsound
import threading

class DigitalClock:
    def __init__(self, master):
        self.master = master
        self.master.title("Digital Clock")

        # Create label for time display
        self.time_label = tk.Label(self.master, font=('Arial', 100), bg='white', fg='black')
        self.time_label.pack(pady=20)

        # Create label for date display
        self.date_label = tk.Label(self.master, font=('Arial', 50), bg='white', fg='black')
        self.date_label.pack()

        # Create drop-down menu for time zone selection
        self.time_zone_label = tk.Label(self.master, text='Time Zone:', font=('Arial', 20))
        self.time_zone_label.pack()
        self.selected_tz = tk.StringVar(self.master, 'Asia/Kolkata')
        self.time_zone_menu = tk.OptionMenu(self.master, self.selected_tz, 'America/New_York', 'Europe/London', 'Asia/Tokyo', 'Asia/Kolkata')
        self.time_zone_menu.pack(pady=10)
        self.time_zone_menu.config(font=('Arial', 20))

        # Create button to set alarm
        self.alarm_button = tk.Button(self.master, text='Set Alarm', command=self.set_alarm)
        self.alarm_button.pack(pady=10)

        # Create entry for alarm time input
        self.alarm_entry = tk.Entry(self.master, font=('Arial', 20))
        self.alarm_entry.pack()

        # Set default time zone
        self.time_zone = pytz.timezone('Asia/Kolkata')

        # Update clock display
        self.update_time()

    def update_time(self):
        current_time = datetime.datetime.now(self.time_zone).strftime('%H:%M:%S')
        current_date = datetime.datetime.now(self.time_zone).strftime('%A, %B %d, %Y')
        self.time_label.config(text=current_time)
        self.date_label.config(text=current_date)
        self.master.after(1000, self.update_time)

    def set_alarm(self):
        try:
            alarm_time_str = self.alarm_entry.get()
            alarm_time = datetime.datetime.strptime(alarm_time_str, '%H:%M:%S')
            alarm_time = self.time_zone.localize(alarm_time)
            now = datetime.datetime.now(self.time_zone)
            time_diff = (alarm_time - now).total_seconds()
            if time_diff < 0:
                time_diff += 86400
            self.master.after(int(time_diff * 1000), self.show_alarm)
            self.alarm_entry.delete(0, tk.END)
        except ValueError:
            tk.messagebox.showerror(title='Error', message='Invalid Time Format')
            
    def show_alarm(self):
        playsound('C:/Users/ACER/Downloads/Music/audio.mp3')

    # Create callback function for time zone selection
    def set_time_zone(self, *args):
        self.time_zone = pytz.timezone(self.selected_tz.get())

root = tk.Tk()
app = DigitalClock(root)

# Set the callback function for the time zone selection menu
app.selected_tz.trace('w', app.set_time_zone)

root.mainloop()

The time and date is being displayed but the alarm doesnt seem to work can someone please help i tried to take entry of the alarm time then check if the time has not already been crossed if yes then the alarm is set for next day and if no then the time diffrence is converted into seconds and then the showalarm function is called after the amount of timediffrence

Ajeet Verma
  • 2,938
  • 3
  • 13
  • 24

1 Answers1

1

Your issue is that since you are only setting hours minutes and seconds in your call you alarm_time = datetime.datetime.strptime(alarm_time_str, '%H:%M:%S') it is by default setting the date portion to be some date in the 1990s or some other date in the distant past.

There are probably more elegant ways of doing this but what you essentially need to do is combine the date from today with the time you receive from the user and then do you seconds to calculations based off of that.

For example:

    def set_alarm(self):
        try:
            alarm_time_str = self.alarm_entry.get()
            alarm_time = datetime.datetime.strptime(alarm_time_str, '%H:%M:%S')
            today = datetime.date.today()
            alarm_time = datetime.datetime(
                today.year,
                today.month,
                today.day,
                alarm_time.hour,
                alarm_time.minute,
                alarm_time.second
            )
            alarm_time = self.time_zone.localize(alarm_time)
            now = datetime.datetime.now(self.time_zone)
            time_diff = (alarm_time - now).total_seconds()
            if time_diff < 0:
                time_diff += 86400
            self.master.after(int(time_diff * 1000), self.show_alarm)
            self.alarm_entry.delete(0, tk.END)
        except ValueError:
            tkinter.messagebox.showerror(title='Error', message='Invalid Time Format')
Alexander
  • 16,091
  • 5
  • 13
  • 29