2013-05-01 19 views
5

Ho fatto questa piccola sveglia con un piccolo aiuto da parte di mio fratello. L'ho provato ieri sera, senza il nonBlockingRawInput e questo ha funzionato bene, ma con il nonBlockingRawInput non ha funzionato. Oggi l'ho provato, ma nessuno dei due funziona! Inserirò il codice con il nonBlockingRawInput e il file "non". Se vuoi il codice senza nonBlockingRawInput, basta chiedere.Python Alarm Clock

Grazie in anticipo.

allarme rpi.py:

import time 
import os 
from non import nonBlockingRawInput 

name = input("Enter your name.") 

print("Hello, " + name) 

alarm_HH = input("Enter the hour you want to wake up at") 
alarm_MM = input("Enter the minute you want to wake up at") 

print("You want to wake up at " + alarm_HH + ":" + alarm_MM) 

while True: 
    now = time.localtime() 
    if now.tm_hour == int(alarm_HH) and now.tm_min == int(alarm_MM): 
     print("ALARM NOW!") 
     os.popen("open mpg321 /home/pi/voltage.mp3") 
     break 

    else: 
     print("no alarm") 
    timeout = 60 - now.tm_sec 
    if nonBlockingRawInput('', timeout) == 'stop': 
     break 

non.py:

import signal 

class AlarmException(Exception): 
    pass 

def alarmHandler(signum, frame): 
    raise AlarmException 

def nonBlockingRawInput(prompt='', timeout=20): 
    signal.signal(signal.SIGALRM, alarmHandler) 
    signal.alarm(timeout) 
    try: 
     text = input(prompt) 
     signal.alarm(0) 
     return text 
    except AlarmException: 
     pass 
    signal.signal(signal.SIGALRM, signal.SIG_IGN) 
    return '' 
+2

Inserire qui il codice. – Marcin

+0

potresti dargli un intervallo di tempo in modo che possa attivarsi se il controllo non colpisce perfettamente l'ora – Chachmu

+3

che dire non funziona? –

risposta

7

ho cercato al vostro codice per un po 'di tempo. Per quanto posso capire, vuoi essere in grado di far scattare un allarme mentre puoi anche digitare "stop" nella shell per terminare il programma, a tal fine puoi rendere l'allarme un thread. Il thread controllerà se è il momento di dire "SVEGLIA!" e apri l'mp3. Se l'utente non ha digitato stop nella shell, il thread andrà in stop e riproverà più tardi.

io essenzialmente utilizzato il codice e appena messo in una classe thread di allarme:

import time 
import os 
import threading 


class Alarm(threading.Thread): 
    def __init__(self, hours, minutes): 
     super(Alarm, self).__init__() 
     self.hours = int(hours) 
     self.minutes = int(minutes) 
     self.keep_running = True 

    def run(self): 
     try: 
      while self.keep_running: 
       now = time.localtime() 
       if (now.tm_hour == self.hours and now.tm_min == self.minutes): 
        print("ALARM NOW!") 
        os.popen("voltage.mp3") 
        return 
      time.sleep(60) 
     except: 
      return 
    def just_die(self): 
     self.keep_running = False 



name = raw_input("Enter your name: ") 

print("Hello, " + name) 

alarm_HH = input("Enter the hour you want to wake up at: ") 
alarm_MM = input("Enter the minute you want to wake up at: ") 

print("You want to wake up at: {0:02}:{1:02}").format(alarm_HH, alarm_MM) 


alarm = Alarm(alarm_HH, alarm_MM) 
alarm.start() 

try: 
    while True: 
     text = str(raw_input()) 
     if text == "stop": 
      alarm.just_die() 
      break 
except: 
    print("Yikes lets get out of here") 
    alarm.just_die() 

Vale la pena notare, che quando il thread è dormire, con:

time.sleep(60) 

E digitato fermati nella shell il thread dovrebbe svegliarsi prima che si rendesse conto che era morto, quindi potresti nel peggiore dei casi aspettare un minuto per la chiusura del programma!

0
import winsound,time 

a= int(input("Enter how many times I have beep :")) 
b= int(input("Enter when to wake up (in seconds) :")) 

time.sleep(b) 

for i in range(a): 
    winsound.Beep(3000,100) 
    winsound.Beep(2500,100) 
    winsound.Beep(2000,100)  
    winsound.Beep(1000,100)  
    winsound.Beep(500,100) 
Problemi correlati