Réveil en python

Contenu du snippet

Voici un petit réveil en Python.
Vous réglez l'heure à laquelle vous souhaitez être réveillé, vous choisissez un fichier .wav ou .ogg en guise de sonnerie et vous activez. Le programme vous réveillera à l'heure dite.
Il nécessite le module pygame pour fonctionner.

Source / Exemple :


#!/usr/env python
# -*- coding: utf-8 -*-

#AUTHOR: Jean-Baptiste Jung - www.jbjweb.com
#LICENSE: GPL - see http://www.gnu.org/copyleft/gpl.html for details

from Tkinter import *
import time, string, sys, tkFileDialog, threading, pygame.mixer, ConfigParser

class myThread(threading.Thread):
    def __init__(self, string_heureDeSonnerie):
        threading.Thread.__init__(self, target=self.run, args=())
	self.string_heureDeSonnerie = string_heureDeSonnerie
	self.test=True
	self.start()

    def run(self):
        while(self.test):
			heure_courante = time.strftime("%H:%M:%S") 
			if (self.string_heureDeSonnerie == heure_courante): 
				pygame.mixer.init() 
				sound = pygame.mixer.Sound(musique) 
				sound.play(-1)
				self.test=False
			else:
				time.sleep (1)
	
			

def clock():
	"""Donne l'heure courante au format hh:mmm:ss et l'affiche"""
	temps = time.strftime("%H:%M:%S")
	heure_actuelle.config(text=temps)
	root.after(200, clock)	
	
def activer():
	global t
	"""Vérifie que les parametres necessaires sont corrects et active le réveil"""
	if (activer.cget("text") == "Activer"):
		hours = heure.get()
		mins = minutes.get()
		if (hours.isdigit()== False or int(hours) > 23):
			erreur("Heures: paramètres invalides")
		elif (mins.isdigit() == False or int(mins) > 59):
			erreur("Minutes: paramètres invalides")
		elif (musique == ""):
			erreur("Aucune sonnerie définie")	
		else:	
			erreur("parametres: ok")
			heure_sonnerie = hours+':'+mins+':'+'00'
			sauverParametres()
			t = myThread(heure_sonnerie)
			etat.config(text="Etat: Sonnera à "+heure_sonnerie[0:5])
			activer.config(text="Stopper")
		
	elif (activer.cget("text") == "Stopper"):
		if (pygame.mixer.get_busy()):
			pygame.mixer.stop()
		t.test = False
		etat.config(text="Etat: Inactif")
		activer.config(text="Activer")
		
def choisirSonnerie():
	"""permet de choisir la sonnerie du réveil"""
	global musique
	musique = tkFileDialog.askopenfilename()
	#TODO: vérifier que le fichier est bien une musique
	if (musique.endswith(".wav") or musique.endswith(".ogg")):
		s.config(text = "Sonnerie: "+str(musique))
		erreur("Sonnerie: ok")
	else:
		musique =""
		erreur("Seuls les formats wav et ogg sont acceptés")	
	
def erreur(string_erreur):
	"""Affiche l'erreur correspondante"""
	message_erreur.config(text=string_erreur)
		
def testerSonnerie():
	"""permet de tester la sonnerie"""
	if (test_sonnerie.cget("text") == "Tester la sonnerie"):
		if (musique ==""):
			erreur("Veuillez choisir une sonnerie.")
		else:
			pygame.mixer.init()
			sound = pygame.mixer.Sound(musique)
			sound.play(-1)
			test_sonnerie.config(text="Arretter le test")
			erreur("Sonnerie: en test")
	elif (test_sonnerie.cget("text") == "Arretter le test"):
		if (pygame.mixer.get_busy()):
			pygame.mixer.stop()
			erreur("")
		test_sonnerie.config(text="Tester la sonnerie")

def restaurerParametres():
	"""restaure les parametres présents dans le fichier 'config.ini' si présent"""
	global musique
	try:
		conf = ConfigParser.ConfigParser()
		conf.read("config.ini")
		conf_heures = conf.get("MAIN", "heures")
		heure.delete(0, END)
		heure.insert(END, conf_heures)
		conf_minutes = conf.get("MAIN", "minutes")
		minutes.delete(0, END)
		minutes.insert(END, conf_minutes)
		conf_sonnerie = conf.get("MAIN", "sonnerie")
		musique = conf_sonnerie
		s.config(text="Sonnerie: "+conf_sonnerie)
	except:
		creerFichier()
	
def sauverParametres():
	"""Enregistre les parametres dans le fichier 'config.ini'"""
	try:
		fichier = open("config.ini", "w")
		fichier.write("")
		fichier.close()
		conf = ConfigParser.ConfigParser()
		conf.read("config.ini")
		conf.add_section("MAIN")
		conf.set("MAIN", "heures", heure.get())
		conf.set("MAIN", "minutes", minutes.get())
		conf.set("MAIN", "sonnerie", musique)
		conf.write(open("config.ini","w"))
	except:
		erreur("Erreur dans l'enregistrement des paramètres")
		
def creerFichier():
	try:
		conf = ConfigParser.ConfigParser()
		conf.add_section("MAIN")
		conf.set("MAIN", "heures", "")
		conf.set("MAIN", "minutes", "")
		conf.set("MAIN", "sonnerie", "")
		conf.write(open('config.ini','w'))		
	except:
		erreur("Impossible de créer le fichier de sauvegarde")
		
def quitter():
	global t
	try:
		t.test=False						#arret du thread
		t.join()
	except NameError: pass #Ignorer l'erreur, le thread n'a pas été lancé	
	if (pygame.mixer.get_busy()):
		pygame.mixer.stop()			#arret du mixer
	root.destroy()					#destruction de la fenetre
	sys.exit(0)						#arret du programme
	
musique = ""
#GUI
root = Tk()
root.title("JBJ Réveil")
heure_actuelle = Label()	
heure_actuelle.grid(row=0, column=0, columnspan = 3, sticky="n")
etat = Label(text="Etat: Inactif")
etat.grid(row = 1, column = 0, columnspan=3, sticky="w")
heure_reveil = Label(text="Heure de réveil: ")
heure_reveil.grid(row = 2, column = 0, columnspan=2, sticky="w")
frame= Frame()
frame.grid(row =2, column =2, sticky="w")
heure = Entry(frame, width=2)
heure.grid( row = 0, column = 0, sticky="w")
h = Label(frame, text="h")
h.grid(row = 0, column = 1, sticky="w")
minutes = Entry(frame, width=2)
minutes.grid(row = 0, column = 2, sticky="w")
s = Label(text="Sonnerie : Aucune")
s.grid(row = 3, column = 0, columnspan =3, sticky ="w")
activer = Button(text="Activer", command = activer)
activer.grid(row = 4, column = 0, sticky="w")
choix_sonnerie = Button(text = "Sonnerie", command = choisirSonnerie)
choix_sonnerie.grid(row = 4, column = 1, sticky="w")
test_sonnerie = Button(text="Tester la sonnerie", command = testerSonnerie)
test_sonnerie.grid(row = 4, column = 2, sticky="w")
message_erreur = Label()
message_erreur.grid(row = 5, column = 0, columnspan = 3, sticky="w")

clock()
restaurerParametres()
root.protocol("WM_DELETE_WINDOW", quitter)
root.mainloop()

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.