Horloge-chronomètre-réveil

0/5 (3 avis)

Vue 19 154 fois - Téléchargée 2 155 fois

Description

Encore une horloge !.....elle est toute petite et elle permet de programmer une alarme (très utile quand vous oubliez l'heure dans votre codage python) elle permet aussi de chronométrer des évènements, mais encore, cerise sur le gâteau, elle donne l'heure !

Source / Exemple :


# horloge analogique
# -*- coding: utf_8 -*-
from Tkinter import *
from math import *
from time import *
from winsound import *

global  hala , mala, heuala, iala, ichro, t0, dessala, iafd
hala, mala, heuala, iala, ichro, t0, dessala, iafd = 0, 0, 0, 0, 0, 0, 0, 0

def dessine_horloge() :
    can1.create_oval(25, 25, 175, 175, fill='', width=8,outline='gold')
    can1.create_oval(20, 20, 180, 180, fill='', width=1)    
    can1.create_oval(92,92,108,108, fill='gold',outline='black',width=1,tag="axe")
    can1.tag_bind("axe","<ButtonRelease>",affich_digit)
    can1.tag_bind("axe","<Enter>",curseur_main)
    can1.tag_bind("axe","<Leave>",curseur_fleche)
    i = 1
    while i < 61 :
        j = i*((2*pi)/60)
        # diametre horloge = 75  centre canvas =100,100
        x=(cos(j)*75)+100
        y=(sin(j)*75)+100
        can1.create_oval(x-1, y-1, x+1, y+1, fill='blue')
        if i in (15,30,45,60):
            can1.create_oval(x-4, y-4, x+4, y+4, fill='black')
        if i in (5,10,20,25,35,40,50,55):
            can1.create_oval(x-2, y-2, x+2, y+2, fill='blue')
        i = i+1

def affich_digit(e) :
    global iafd
    if iafd == 0 :
        iafd=1
    else : iafd=0    
    
def aff_heure() :
    global  hala, mala, heuala, indala, iafd
    dateheure=localtime()
    heur=dateheure[3]
    minu=dateheure[4]
    seco=dateheure[5]
    heurd=heur
    minud=minu
    if str(heur) == str(hala) and str(minu) == str(mala) and iala == 1 :
        Beep(800,100)
    if heur >12 :
        heur = heur -12        
    if ichro == 1 :
        t1=(dateheure[3]*3600)+(dateheure[4]*60)+dateheure[5]
        tchro = t1 - t0
        hchro = int(tchro/3600)
        mchro = int((tchro-(hchro*3600))/60)
        schro=tchro-(hchro*3600)-(mchro*60)
        affchro.configure(text = '%d' %hchro+'.%02d' %mchro+'.%02d'%schro, bg='white')
    # affich heures
    heur=heur+(minu/60.00)
    j=(heur+9)*((2*pi)/12)
    x=(cos(j)*55)+100
    y=(sin(j)*55)+100
    can1.coords(aigheu, 100, 100, x, y)
    # affich minutes
    minu=minu+(seco/60.0)
    j=(minu+45)*((2*pi)/60)
    x=(cos(j)*65)+100
    y=(sin(j)*65)+100
    can1.coords(aigmin, 100, 100, x, y)
    # affich secondes
    j=(seco+45)*((2*pi)/60)
    x=(cos(j)*70)+100
    y=(sin(j)*70)+100
    can1.coords(aigsec, 100, 100, x, y)
    if ichro == 1 and tchro < 60 :
        x=(cos(j)*84)+100
        y=(sin(j)*84)+100
        can1.create_oval(x-1, y-1, x+1, y+1, fill='green', outline='darkgreen')
    #afficher heure digitale
    if iafd == 1 :
        afdigi.configure(text = '%d' %heurd +" h " +'%02d' %minud)
    else : afdigi.configure(text ='',bg='lightgrey')
    can1.after(999,aff_heure)

def dessine_alarme() :
    global can2 , choixala, iala, dessala
    if dessala == 0 :
        can2 = Canvas(fen1, width=200, height=50, bg='lightgrey')
        can2.pack()
        choixala = Label(can2,font=('Arial', 7),fg='darkgreen')
        choixala.pack(side=BOTTOM)
        curs= Scale(can2, from_=0.0, to=12.00, length=150, sliderlength=7,
                    resolution=0.01, showvalue=0, orient=HORIZONTAL,
                    label="Réglage de l'alarme :",command=choix_alarme,font=('Arial', 8),fg='blue')
        curs.pack(side=LEFT)
        bouon=Button(can2, text="On", command=set_alarme,font=('Arial', 7),bg='grey')
        bouon.pack(side=BOTTOM)
        dessala = 1
        bouoff=Button(can2, text="Off", command=setoff_alarme,font=('Arial', 7),bg='grey')
        bouoff.pack(side=BOTTOM)
    
def choix_alarme(valcurs) :
    global  hala, mala, heuala
    heuala=float(valcurs)
    j=(heuala+9)*((2*pi)/12)
    x=(cos(j)*70)+100
    y=(sin(j)*70)+100
    can1.coords(aigala, 100, 100, x, y)
    can1.itemconfigure(aigala,fill="red")
    hala=int(heuala)
    mala=int((heuala - hala) * 60)
    dateheure=localtime()
    heur=dateheure[3]
    if heur > 11 :
        hala = hala + 12
    choixala.configure(text = "Déclencher l'alarme à " +'% d' %hala +" h. " +'%02d' %mala)

def set_alarme() :
    global indala, iala, dessala
    dessala = 0
    if iala ==1 :
        can1.delete(indala)
    bouala.config(bg='red')
    j=(heuala+9)*((2*pi)/12)
    x=(cos(j)*75)+100
    y=(sin(j)*75)+100
    indala=can1.create_oval(x-2, y-2, x+2, y+2, fill='red')
    iala =1
    affala.configure(text = '%d' %hala +" h." +'%02d' %mala,bg='white')
    can2.destroy()
    Beep(1000,20)

def setoff_alarme() :
    global indala, iala, dessala
    if dessala == 1 :
        can2.destroy()
        dessala = 0
    bouala.config(bg='grey')
    can1.itemconfigure(aigala,fill="lightgrey")
    if iala ==1 :
        can1.delete(indala)
    iala =0
    affala.configure(text = '',bg='lightgrey')
    Beep(100,50)

def chrono() :
    global ichro, t0
    if ichro == 0 :
        ichro = 1
        dateheure=localtime()
        t0=(dateheure[3]*3600)+(dateheure[4]*60)+dateheure[5]
        bouchro.config(bg='green')
    elif ichro == 1 :
        ichro = 2
        bouchro.config(bg='lightblue')
    else :
        ichro = 0
        bouchro.config(bg='grey')
        can1.create_oval(16, 16, 184, 184, fill='', outline='lightgrey', width=6)
        affchro.configure(text='',bg='lightgrey')

def aff_infos(e) :
    feninf = Toplevel()
    feninf.config(bg='lightblue')
    geo1=fen1.winfo_geometry()
    geox=fen1.winfo_rootx()
    geoy=fen1.winfo_rooty() 
    feninf.geometry("270x260+"+str(geox-50)+"+"+str(geoy-22))
    feninf.title("À propos de Horloge")
    labinf=Label(feninf, bg='lightblue',fg='black',width=50,font=('Arial', 9),
        text= "\nHorloge v.1.3\n\n"
                "Programme écrit en Python / Tkinter\n"
                 "et distribué sous licence GNU GPL.\n\n"
                "© 2007  Yves Le Chevalier\n"
                 "( yveslechevalier@free.fr )\n\n"
                "Ce programme affiche une horloge      \n"
                "avec une alarme, un chronomètre et    \n"
                 "un affichage digital losque l'on clique  \n"
                 "sur l'axe des aiguilles.                            ")
    labinf.pack(pady=5)
    bouf3=Button(feninf, text="Fermer", command=feninf.destroy,bg="orange", fg='brown')
    bouf3.pack(side=BOTTOM,pady=10)
    #feninf.transient()
    feninf.grab_set()
    feninf.wait_window()
    
def curseur_main(e) :
    fen1.config(cursor='hand2')

def curseur_fleche(e) :
    fen1.config(cursor='arrow')
     
# main
fen1 = Tk(className='Horloge')
fen1.geometry("+500+400")
fen1.resizable(width=False, height=False)
can1 = Canvas(fen1, width=200, height=200, bg='lightgrey')
aigala = can1.create_line(100, 100, 100, 35, fill='', width=1,arrow=LAST)
aigheu = can1.create_line(100, 100, 100, 50, fill='blue', width=3)
aigmin = can1.create_line(100, 100, 100, 40, fill='blue', width=2)
aigsec = can1.create_line(100, 100, 100, 27, fill='yellow', width=1)
bouala=Button(can1, text="Alarme", command=dessine_alarme, font=('Arial', 7),bg='grey')
bouala.place(x=2,y=2)
affala = Label(can1, font=('Arial', 7))
affala.place(x=4,y=22)
bouchro=Button(can1, text="Chrono", command=chrono, font=('Arial', 7),bg='grey')
bouchro.place(x=163,y=2)
affchro = Label(can1, font=('Arial', 7))
affchro.place(x=164,y=22)
bquit=Button(can1, text="Quitter", command=fen1.destroy, font=('Arial', 6),bg='pink',fg='black')
bquit.place(x=2,y=183)
afdigi = Label(can1, font=('Arial',9,'bold'),fg="blue")
afdigi.place(x=78,y=188)
signature='YLC.gif'
signat=PhotoImage(file=signature)
sign=can1.create_image(192,195, image=signat,tag="ylc")
can1.tag_bind("ylc","<ButtonRelease>",aff_infos)
can1.tag_bind("ylc","<Enter>",curseur_main)
can1.tag_bind("ylc","<Leave>",curseur_fleche)
can1.pack()

dessine_horloge()
aff_heure()

fen1.mainloop()

Conclusion :


Rien de spectaculaire en terme de code, mais ça peut servir comme petit exemple python pour des débutants.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Ca marche po
yveslc Messages postés 7 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 17 novembre 2008
17 nov. 2008 à 19:16
Bonjour Jacques,
L'image avec ma signature aurait pu contenir n'importe quoi d'autre, mais, justement pour un débutant, cela lui permet de voir commant manipuler une image (aussi petite soit-elle) dans un canvas et de la rendre interactive.
Quant aux commentaires, les noms ce procédures sont, à mon avis, assez significatifs pour en expliquer la destination. Enfin tu as peut-être raison !....
A+
Yves
jactrouillet Messages postés 6 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2008
17 nov. 2008 à 11:23
Bonjour,

Pas le temps de regarder le détail du code tout de suite, Mais je vois là en effet un très pédagogique exemple pour les débutants. Bravo

Juste deux petites remarques:
-Pourquoi ne pas mettre des commentaires explicatifs, justement pour aider ces débutants?
-Ne pas mettre ta signature qui plante inévitablement ce programme chez tout débutant. Lequel risque ainsi de se décourager en pensant que cela ne fonctionne pas.

Voilà, c'était juste un avis rapide mais globalement favorable.

Jacques

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.