Outils pour utilisateurs

Outils du site


compte_a_rebours

Comment afficher un compte à rebours en heures, minutes et secondes

Objectif

Afficher un compte à rebours par seconde dans une fenêtre graphique (ici Tkinter) n'est pas si facile, parce que ça nécessite un thread.

Voilà une solution possible

Code proposé

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
from __future__ import division
 
import Tkinter
import threading
import time
 
###############################################################################
def sec2hms(sd):
    """Transforme les secondes sd en chaine "hh:mm:ss" pour affichage"""
    h=0
    m=0
    s=sd
    if s >= 60:
        m = s//60
        s -= m*60
        if m >= 60:
            h = m//60
            m -= h*60
    return "%02d:%02d:%02d" % (h, m, s)
 
##################################################################
class Comptearebours(threading.Thread):
 
    def __init__(self, h, m, s):
        threading.Thread.__init__(self)
        self.t = h*3600 + m*60 + s
        self.encore = True
 
    def run(self):
        global app
        t1 = int(time.time())
        app.varsaisie.set(sec2hms(self.t))
        while self.encore:
            t2 = int(time.time())
            if t2>t1:
                self.t -= t2-t1
                if self.t <= 0:
                    self.t = 0
                    self.encore = False
                app.varsaisie.set(sec2hms(self.t))
                t1 = t2
            time.sleep(0.01)
 
    def stop(self):
        self.encore = False
 
##################################################################
class Application(Tkinter.Frame):
 
    def __init__(self, master=None):
 
        Tkinter.Frame.__init__(self, master)
 
        self.grid()
        self.varsaisie = Tkinter.StringVar()
        self.varsaisie.set("")
        self.saisie=Tkinter.Entry(self,  background="white", width=50, textvariable=self.varsaisie)
        self.saisie.grid(row=0,column=0,padx=3, pady=6)
 
        self.depart = Tkinter.Button(self, text="  Départ  ", command=lambda:self.partir(self))
        self.depart.grid(row=1, column=0, padx=3, pady=3, sticky="e")
 
        self.stop = Tkinter.Button(self, text="  stop  ", command=lambda:self.stopper(self))
        self.stop.grid(row=1, column=1, padx=3, pady=3, sticky="w")
 
        self.saisie.focus_set()
 
    def partir(self,event):
        """Lance le compte à rebours"""
        self.chrono = Comptearebours(0,0,20)
        self.chrono.setDaemon(True)
        self.chrono.start()
 
    def stopper(self,event):
        """Arrête le compte à rebours avant la fin normale"""
        self.chrono.stop()
 
##############################################################################
# lancement et affichage de la fenetre
#
if __name__ == "__main__":
    fen=Tkinter.Tk()
    fen.title(u"Compte à rebours")
    app=Application(fen)
    fen.mainloop()

Vous pouvez intégrer l'ensemble de ce code par copier-coller.

Au lancement, il vient une petite fenêtre qui comporte 3 éléments: une zone de texte pour l'affichage et 2 boutons “départ” et “stop”.

On clique sur le bouton départ, et il s'affiche le temps de départ sous la forme “hh:mm:ss”.

Toutes les secondes, un nouvel affichage est déclenché avec le temps décroissant.

L'affichage s'arrête à 00:00:00 (le thread s'arrête tout seul) ou si l'utilisateur clique sur le bouton “stop”.

On appelle le thread qui fait le compte à rebours dans la méthode “partir” (ligne 71) avec comme paramètres les heures, minutes et secondes de départ. Pour l'essai, j'ai mis comme temps de départ h=0, m=0, s=20 (donc 20 sec qui s'affichent “00:00:20”), mais on peut mettre ce qu'on veut.

Bon. Il ne faut tout de même pas trop demander aux threads Python. Il est possible en effet qu'une charge importante du PC amène des irrégularités d'affichage. Cependant, tel que programmé, le temps affiché restera juste puisque j'utilise le temps de l'ordinateur pour décrémenter le compteur.

Si nécessaire, il serait facile de modifier le code pour que l'affichage commence à 00:00:00 et s'incrémente jusqu'à un temps donné au départ.


Amusez-vous bien!

compte_a_rebours.txt · Dernière modification: 2009/10/08 07:57 par tyrtamos

Outils de la page