Вы можете использовать объекты datetime и затем вычесть начало из datetime конца, чтобы получить объект timedelta.Затем используйте total_seconds
timedelta для расчета времени окончания в миллисекундах (добавив его к pygame.time.get_ticks()
) и воспроизводите сигнал будильника, когда время будильника - pygame.time.get_ticks () меньше 0.
Чтобы остановить таймер, вы можете поместить код таймера в условие if (if timer_active:
) и установить timer_active = False
, когда пользователь нажимает клавишу ( S в примере ниже).
import datetime
import pygame as pg
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
SOUND = pg.mixer.Sound(r"C:\Dokumente\Pythonprogramme\win3.wav")
def main():
start = datetime.datetime.now()
print("current time is: ", start)
h = int(input("Enter the hour: "))
m = int(input("Enter the minutes: "))
s = int(input("Enter the seconds: "))
# I just pass the current year, month and day here, so it'll
# work only if the end time is on the same day.
end = datetime.datetime(start.year, start.month, start.day, h, m, s)
timedelta = end-start
alarm_time = pg.time.get_ticks() + timedelta.total_seconds()*1000
repeat_time = 3000 # Repeat the alarm after 3000 ms.
timer_active = True
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
return
elif event.type == pg.KEYDOWN:
if event.key == pg.K_s:
# Stop the sound and the timer.
SOUND.stop()
timer_active = False
if timer_active:
if alarm_time - pg.time.get_ticks() < 0: # Time is up.
SOUND.play() # Play the sound.
# Restart the timer by adding the repeat time to the current time.
alarm_time = pg.time.get_ticks() + repeat_time
screen.fill(BG_COLOR)
pg.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()
pg.quit()
Обратите внимание, что этот пример работает, только если время окончания указано в тот же день.