1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| # -*- coding: cp1252 -*-
#---Compte à rebours---
from Tkinter import *
import threading
class CompteARebours(Tk):
def __init__(self, duree=10):
Tk.__init__(self) #Constructeur de la classe parente
self.dureeIni = int(duree*60)
self.title('Compte à rebours')#(Compte à rebours')
self.coulBg='grey92'
self.configure(bg=self.coulBg)
self.f1 = Frame (self, bg=self.coulBg, width=200, height=85)
self.f1.grid(padx=5, pady =5)
self.f1.grid_propagate(0)
self.f2 = Frame (self, bg=self.coulBg)#, width=300, height=50)
self.f2.grid(padx=5, pady =5)
self.boutStart = Button (self.f2, text='Démarrer', command=self.start)
self.boutStart.grid(row=2, column=1, padx=5, pady=5)
self.boutPause = Button (self.f2, width=8, command=self.pause)
self.boutPause.grid(row=2, column=2, padx=5, pady=5)
self.boutStop = Button (self.f2,text='Arrêter et réinitialiser'\
,command=self.stop)
self.boutStop.grid(row=2, column=3, padx=5, pady=5)
self.texte = Label (self.f1, font=('Arial',40), bg=self.coulBg)
self.texte.grid(padx=10, pady=10)
self.init()
def init(self):
"(Ré)initialise les données"
self.duree = self.dureeIni #La durée du chrono se réinitialise
self.ipause = False
self.boutPause.configure(text='Pause')
self.boutStart['state'],self.boutStop['state'],self.boutPause['state']=\
'normal','disabled','disabled'
self.coul = 'blue'
self.affichage(self.coul)
self.texte.configure(font=('Arial',40))
self.dessine_sablier()
def affichage(self, coul, hauteur=150, largeur=35):
"Prépare l'affichage du chronomètre"
affich = str(self.duree/60).zfill(2), ':', str(self.duree%60).zfill(2)
self.texte.configure(text=affich, fg=coul)
def variation(self):
"Actualise le chronomètre avec la couleur correspondante"
if not self.ipause and not self.istop:
if self.duree/60==0: #Dernière minute du chrono
self.coul = 'red'
self.affichage(self.coul)
if self.duree==0: #Lorsque le chrono atteint zéro
self.istop = True
self.boutPause['state']='disabled'
self.f3.delete(ALL)
self.after(5000, self.init)
else: #Affichage "classique"
self.coul = 'green'
self.affichage(self.coul)
self.dessine_sablier()
if not self.istop: #Recomence la boucle après 1 sec
self.chrono = threading.Timer(1,self.variation)
self.chrono.start()
self.duree -= 1
def start(self):
"Démarre le chronomètre"
self.istop = False
self.boutStart['state'],self.boutStop['state'],\
self.boutPause['state'] = 'disabled','normal','normal'
self.variation()
def pause(self):
"Provoque une pause au chronomètre"
self.ipause = not self.ipause
if self.ipause:
self.chrono.cancel()
self.boutPause.configure(text='Reprendre')
self.duree += 1
self.coul = 'orange'
self.affichage(self.coul)
self.iclign = True
self.dessine_sablier()
else:
self.boutPause.configure(text='Pause')
self.variation()
self.iclign = False
self.clignotement()
def stop(self):
"Remet le compteur à 0 puis réactualise"
self.chrono.cancel()
self.istop = True
self.init()
def clignotement(self):
if self.ipause:
self.clign = threading.Timer(0.7,self.clignotement)
self.texte.configure(font=('Arial',40,'italic'))
if self.iclign:
self.affichage(self.coulBg)
else:
self.coul = 'orange'
self.affichage(self.coul)
self.iclign =not self.iclign
self.clign.start()
else:
self.texte.configure(font=('Arial',40)) #Essayer self.clign._Thread__stop()
self.clign.cancel()
def dessine_sablier (self, hauteur=150, largeur=35, varcoul=2):
"""Dessine un sablier sous forme d'un rectangle rétrécissant.
varcoul=0 ==> couleur uniforme du sablier,
varcoul=1 ==> couleurs identiques à celles du chronomètre,
varcoul=2 ==> dégradé de couleurs"""
if varcoul==0:
coulSab = 'blue'
elif varcoul==1:
coulSab = self.coul
elif varcoul==2:
coulSab = self.var_coul()
self.f3 = Canvas (self, bg='grey80', width=largeur, height=hauteur)
self.f3.grid(row=0, column=1, rowspan=2, padx=15, pady =10)
h = hauteur - (self.duree / float(self.dureeIni) * hauteur)
if self.duree!=0:
self.f3.create_rectangle(0, h, largeur+1, hauteur+1,\
fill=coulSab, outline=coulSab)
def var_coul(self):
"Fait varier la couleur du sablier en fct du temps restant"
chronoInv = self.dureeIni - self.duree #Valeur de l'abscisse
delta = 255. / (self.dureeIni/3) #Pente de la droite
if chronoInv < self.dureeIni/3: #1er tiers de l'équation
R = 0 #Equation du type y = b + ax (pour la teinte rouge)
G = delta * chronoInv #Equation du type y = b + ax (pour le vert)
B = 255 - delta * chronoInv#Equation du type y = b + ax (pour bleu)
elif self.dureeIni/3 <= chronoInv < 2*self.dureeIni/3: #2eme tiers
R = delta * (chronoInv - self.dureeIni/3)
G = 255
B = 0
elif 2*self.dureeIni/3 <= chronoInv <= self.dureeIni: #3eme tiers
R = 255
G = 255 - delta * (chronoInv - 2*self.dureeIni/3)
B = 0
return '#' + hex(int(R))[2:].zfill(2) + hex(int(G))[2:].zfill(2)\
+ hex(int(B))[2:].zfill(2) #Retourne un code hexadécimal...
#...sous la forme #RRGGBB
if __name__ == "__main__": #Si le module est exécuté en tant que programme...
app = CompteARebours(1.30)#...et non en tant que bibliothèque de classes
app.mainloop() |
Partager