2017-03-26 5 views
3

Ich versuche, einen einfachen Alarm mit Python zu machen, aber was auch immer ich versuche, es scheint nicht zu funktionieren. Ich habe gerade einen Timer gemacht, aber ein Alarm wäre ein wenig nützlicher. Ich bin auch ziemlich neu in Python, so dass ich mir nicht wirklich aller Regeln und Syntax bewusst bin.Wie mache ich einfache Alarme auf Python

import datetime 
import os 
stop = False 
while stop == False: 
    rn = str(datetime.datetime.now().time()) 
    print(rn) 
    if rn == "18:00:00.000000": 
     stop = True 
     os.system("start BTS_House_Of_Cards.mp3") 

When I run the file, it prints the time but goes completely past the time I want the alarm to go off at.

+0

Der Alarm wird nur ausgelöst, wenn 'datetime.now()' * genau * '" 18: 00: 00.000000 "' ist. Was passiert, wenn Sie 'datetime.now()' bei 17: 59: 59.999999 aufrufen und dann um 18: 00: 00.000001 anrufen? –

+0

Sie müssten sehr glücklich sein, genau 18: 00: 00.000000 zu treffen. – timgeb

+0

Also müsste ich einen Bereich mit '<' or '>' verwenden? –

Antwort

1

Ersetzen Sie einfach: wenn rn == "18: 00: 00,000000":

mit: wenn rn> = "18: 00: 00,000000":

1

für Folgendes verwenden Runde auf die nächste Minute (oder für Sekunden usw. anzupassen)

import datetime as dt 

rn = dt.datetime.now() 
# round to the next full minute 
rn -= dt.timedelta(seconds = rn.second, microseconds = rn.microsecond) 
rn += dt.timedelta(minutes=1) 

Zur Anpassung für Sekunden seconds = rn.second entfernen, und dann minutes um in der nächsten Zeile ändern seconds

Wie es funktioniert

Entfernt die Sekunden und Mikrosekunden von der aktuellen Zeit und fügt dann eine Minute hinzu und rundet sie auf die nächste ganze Minute ab.

+0

Die Verwendung der für Sekunden angepassten Version würde höchstwahrscheinlich für einen Alarm besser funktionieren. –

2

Das technische Problem hier ist, dass wenn Sie rufen datetime.now() immer wieder auf, Sie können es nicht immer schnell genug nennen, um alle möglichen Werte zu erhalten. So sollte == stattdessen >= sein. Dies ist jedoch immer noch nicht sehr gut.

Ein viel besserer Weg, dies zu tun, ist time.sleep() statt Schleifen zu verwenden.

import datetime 
import os 
import time 

now = datetime.datetime.now() 

# Choose 6PM today as the time the alarm fires. 
# This won't work well if it's after 6PM, though. 
alarm_time = datetime.datetime.combine(now.date(), datetime.time(18, 0, 0)) 

# Think of time.sleep() as having the operating system set an alarm for you, 
# and waking you up when the alarm fires. 
time.sleep((alarm_time - now).total_seconds()) 

os.system("start BTS_House_Of_Cards.mp3") 
Verwandte Themen