IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

rafraichissement horloge tkinter [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 113
    Points
    113
    Par défaut rafraichissement horloge tkinter
    Bonjour,

    Je cherche à creer un petit programme de gestion du temps. J'ai crée l'interface et je commence le reste...
    Je cherche à faire un refresh de l'heure courante dans self.labHorloge (ligne 19)
    Mon probleme c'est que je ne vois pas de quelle façon? Je pensais créer une variable typé StringVar et utiliser la méthode set() mais je ne peux pas boucler sur le constructeur de la classe Application.
    Ma question est faut t il faire une boucle dans le programme principal (avec la fonction after() par exemple)? Ou creer une classe Horloge()? Ou dans une nouvelle méthode?
    Si quelqu'un peut juste m'orienter, je chercherai pour le code...
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    from tkinter import *
    import time
    # Module donnant accès aux boîtes de dialogue standard pour
    # la recherche de fichiers sur disque :
    from tkinter.filedialog import asksaveasfile, askopenfile
     
    class Application(Frame):
        '''Fenêtre d'application'''
        def __init__(self):
            Frame.__init__(self)
            self.master.title("Gestion des heures")
            self.dico ={} # création du dictionnaire
            # Les widgets sont regroupés dans deux cadres (Frames) :
            frSup =Frame(self) # cadre supérieur contenant 5 widgets
            Button(frSup, text ="Valider", width =10,
                   ).grid(row=1,column =1)
            Label(frSup, text ="Horloge :",
                  width =15).grid(row=1,column =2)
            self.labHorloge =Label(frSup, width =30,relief =SUNKEN,
                                   text = time.strftime("%A %d %B %Y %H:%M:%S")) # champ d'entrée pour
            self.labHorloge.grid(row=1,column =3) # l'heure
     
            #print(time.strftime("%A %d %B %Y %H:%M:%S"))
     
     
     
     
            Label(frSup, text ="Temps restant :",
                  width =15).grid(row=1,column =4)
            self.enCode =Entry(frSup, width =15) # champ d'entrée pour
            self.enCode.grid(row=1,column =5) # le décompte.
            frSup.pack(padx =5, pady =5)
     
            frInf =Frame(self) # cadre inférieur contenant le reste
            self.test = Label(frInf, bg ="white", width =45, # affichage log
                   height =7, relief = SUNKEN)
            self.test.pack(pady =5)
            Button(frInf, text ="Arrivé", width =10,
                   ).pack(side = LEFT, pady =25)
            Button(frInf, text ="Depart", width =10,
                   ).pack(side = LEFT, pady =5)
            Button(frInf, text ="Repas", width =10,
                   ).pack(side =RIGHT, pady =5)
            Button(frInf, text ="Pause", width =10,
                   ).pack(side =RIGHT, pady =5)
     
     
            frInf.pack(padx =5, pady =5)
            self.pack()
     
     
     
     
     
        def enregistre(self):
            "enregistrer le dictionnaire dans un fichier texte"
            # Cette méthode utilise une boîte de dialogue standard pour la
            # sélection d'un fichier sur disque. Tkinter fournit toute une série
            # de fonctions associées à ces boîtes, dans le module filedialog.
            # La fonction ci-dessous renvoie un objet-fichier ouvert en écriture :
            ofi =asksaveasfile(filetypes=[("Texte",".txt"),("Tous","*")])
            for clef, valeur in list(self.dico.items()):
                ofi.write("{0} {1}\n".format(clef, valeur))
            ofi.close()
     
        def restaure(self):
            "restaurer le dictionnaire à partir d'un fichier de mémorisation"
            # La fonction ci-dessous renvoie un objet-fichier ouvert en lecture :
            ofi =askopenfile(filetypes=[("Texte",".txt"),("Tous","*")])
            lignes = ofi.readlines()
            for li in lignes:
                cv = li.split() # extraction de la clé et la valeur corresp.
                self.dico[cv[0]] = cv[1]
            ofi.close()
     
     
     
     
    if __name__ == '__main__':
        Application().mainloop()

  2. #2
    Membre régulier
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Amateur
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2015
    Messages : 52
    Points : 94
    Points
    94
    Par défaut
    Bonjour,

    Tu ne peux pas en effet faire de boucles sans bloquer tout le GUI. Le mieux est comme tu l'as suggéré d'utiliser after pour appeler une fonction qui mets à jour le label de ton horloge. Tu appelles cette fonction toutes les secondes. Dans la fonction de mise à jour de l'heure tu devras appeler de nouveau after une seconde plus tard.

    Note que after ne garanti pas que l'appel se fasse exactement 1 seconde plus tard. La seule garantie que tu as est que ça n'arrive pas plus tôt. Si le système est occupé avec d'autres tâches, l'appel pourrait se faire en retard. Et en accumulant les appels, ça pourrait créer une différence notable. Un manière d'y remédier est de sauvegarder au début du programme le temps t0 avec time.perf_counter et de toujours d'utiliser after pour appeler ta fonction de mise à jour toutes les secondes (plus ou moins précisément). Dans cette fonction, tu vas regarder le temps actuel avec time.perf_counter et calculer la différence avec le temps t0. Tu auras donc le nombre exact de secondes depuis le démarrage de ton programme.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Citation Envoyé par loncle Voir le message
    Ma question est faut t il faire une boucle dans le programme principal (avec la fonction after() par exemple)? Ou créer une classe Horloge()? Ou dans une nouvelle méthode?
    Le plus simple est de passer par .after pour mettre à jour le temps affiché si nécessaire i.e. si l'appel time.strftime retourne une chaîne de caractères différente.
    Pour éviter des retards, il faut "boucler" plutôt toutes les 20ms que toutes les secondes.

    classe Horloge ou méthodes dans "Application" ? La chose étant la spécialisation d'un Label avec des méthodes "start" et "stop", vous pouvez en faire une "class". Ca évite d'alourdir Application et çà pourra se tester sans le reste.

    - W

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Horloge digitale Tkinter
    Par Meets dans le forum Tkinter
    Réponses: 2
    Dernier message: 10/05/2010, 18h41
  2. Thread et rafraichissement Tkinter
    Par panda31 dans le forum Tkinter
    Réponses: 8
    Dernier message: 25/05/2009, 09h48
  3. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 19h07
  4. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 17h15
  5. Timage rafraichissment
    Par Rizzla dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/09/2002, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo