Как отключить будильник при нажатии клавиши? - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь написать код Python для будильника.У меня 2 сомнения -
1) Сравнение между местным и пользовательским временем ввода не произойдет, если я не добавлю 0 перед каждым числом.Экс-ч: м: с = 08:09:35.Это не работает, если я печатаю - 8: 9: 35
2) Как я могу отключить будильник при нажатии любой клавиши?команда ввода не работает.

код:

#strfime is of type string
#localtime is of time int

#using strftime
import time
from pygame import mixer

def sound():
    mixer.init()
    mixer.music.load("F:\learn\python\music1.mp3")  #file is 28 seconds long

def userinput():

    print("current time is: ",time.strftime("%H:%M:%S"))  
    h=(input("Enter the hour: "))               
    m=(input("Enter the minutes: "))
    s=(input("Enter the seconds: "))
    alarm(h,m,s)


def alarm(h,m,s):  
    n=2                         #rings twice in 1 minute.

    while True: 
        if time.strftime("%H") == h and time.strftime("%M") == m and time.strftime("%S") == s:

            print("wake up!!!! \n")
            break

    sound()
    while n>0:                                  #code for ringing twice in a minute.
        mixer.music.play()
        time.sleep(30)                          #alarm should stop when any key pressed.
        mixer.music.stop()
        n-=1


    snooze_in = input("Do you want to snooze? press y or n. ")

    if snooze_in == 'y':
        print("The alarm will start in 5 seconds")
        time.sleep(5)               #snooze for x seconds
        h=time.strftime("%H")
        m=time.strftime("%M")
        s=time.strftime("%S")

        return alarm(h,m,s)

    else:
        exit()    



if __name__=="__main__":
    userinput()

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете использовать объекты 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()

Обратите внимание, что этот пример работает, только если время окончания указано в тот же день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...