Partage
  • Partager sur Facebook
  • Partager sur Twitter

Faire boucler indéfiniment une tempo

Sujet résolu
    17 novembre 2019 à 11:46:39

    Bonjour,

    Tout nouveau sur ce forum et tout nouveau en Python.

    J'aimerais réaliser un petit programme qui consiste à lire une données toutes les x secondes, qui recommence indéfiniment et qui me permet d'effectuer quelques calculs pendant les x secondes.

    Je résume :

    (a) - je vais lire une donnée a

    (b) - je lance une tempo

         - pendant ce temps, j'effectue quelques calculs

    (c) - la tempo terminée, je recommence (a)

    J'ai cherché mais...

    Merci à celui (ou ceux) qui peuvent me mettre sur la voie

    • Partager sur Facebook
    • Partager sur Twitter
      17 novembre 2019 à 18:14:28

      import time
      while True:
          time.sleep(10) # en s
          # calcul
      • Partager sur Facebook
      • Partager sur Twitter
        18 novembre 2019 à 0:00:58

        Merci Coliculus d'avoir répondu MAIS je ne pense pas que ce soit la solution. Les calculs se font APRES l'écoulement de la tempo et non PENDANT.

        J'effectue quand même des essais.

        Merci.

        • Partager sur Facebook
        • Partager sur Twitter
          18 novembre 2019 à 3:34:48

          Faudrait utiliser l'heure alors, avec un module comme datetime par exemple, pour calculer le temps écoulé depuis le moment où tu as lancé le calcul et non pas ajouter un délai après avoir fini l'opération.

          -
          Edité par LoupSolitaire 18 novembre 2019 à 3:36:00

          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            18 novembre 2019 à 11:30:42

            Salut, tu devrais essayer de t'interesser au module threading :

            from threading import Thread

            C'est au programme du cours de Vincent Le Goff.

            Bon courage ;)

            • Partager sur Facebook
            • Partager sur Twitter

            La vie c'est comme une boite de chocolat ça dure moins longtemps chez les gros.

              18 novembre 2019 à 11:57:28

              Faire un thread juste pour compter le temps ça me parait un peu trop.

              Il y a la possibilité comme l'a dit LoupSolitaire de calculer le temps écoulé :

              import time
              
              DELAI = 10
              
              while True:
                  heure = time.time()
                  # calculs
                  heure, ancienneheure = time.time(), heure
                  time.sleep(max(0, DELAI - (heure - ancienneheure)))


              Mais en vérité les calculs ne se feront pas exactement chaque 10 secondes car le calcul du temps + l'appel de fonction sleep créera un petit décalage multiplié par le nombre d'itération.

              La fonction max est nécessaire au  cas où le temps écoulé serait supérieur à 10 secondes (time.sleep ne prend pas les valeurs négatives ...)

              Il y a aussi la possibilité de faire une pause jusqu'à ce que l'heure soit un multiple de 10 secondes :

              import time
              
              DELAI = 10
              
              while True:
                  # calculs
                  time.sleep(max(0, DELAI - (time.time() % DELAI)))
              

              Le max ici est théoriquement inutile mais bon on ne sait jamais, un arrondi foireux ...

              -
              Edité par thelinekioubeur 18 novembre 2019 à 11:59:51

              • Partager sur Facebook
              • Partager sur Twitter
                19 novembre 2019 à 17:13:27

                Merci 'LoupSolitaire', 'KevKev01' et 'thelinekioubeur'.

                J'ai trouvé sur le Net une fonction qui compte indéfiniment avec de la récursivité

                def incremente():

                   #Incrémente le compteur à chaque seconde"

                    global compteur

                    compteur += 1

                    compteur_lbl['text'] = str(compteur)   # un label 

                    compteur_lbl.after(1000, incremente) # et on boucle

                (excusez-moi, je ne sais pas comment faire une présentation comme vous......expliquez-moi. Merci!)

                Ca marche très bien mais :

                - j'aimerais le remettre à zéro (ex : compteur = 1000 alors compteur = 0)

                - je n'arrive pas à récupérer la valeur de 'compteur' hors fonction (ex : pour travailler si compteur = 200)

                Merci de votre aide

                • Partager sur Facebook
                • Partager sur Twitter
                  19 novembre 2019 à 21:18:18

                  La méthode after c'est pour tkinter
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 novembre 2019 à 21:54:31

                    J'ai réduit mon programme. le voici :
                    from tkinter import *
                    import time
                    
                    compteur = 0
                    
                    # fonction qui incrémente un compteur et qui boucle sur elle même
                    def incremente():
                       #Incrémente le compteur à chaque seconde"
                        global compteur
                        compteur += 1
                        LC['text'] = str(compteur)  # label 1  
                        LC.after(1000, incremente)
                    
                    Mafenetre = Tk()
                    Mafenetre.title('Test')
                    Mafenetre.geometry('300x100+1000+500')
                    
                    # label 1
                    LC = Label(Mafenetre, text = '-', bg='white', fg='black') 
                    LC.place(x=2, y=2, width=100)
                    
                    # label dans lequel j'aimerais afficher le compteur
                    # hors fonction
                    LE = Label(Mafenetre, text = '-', bg='white', fg='black') 
                    LE.place(x=104, y=2, width=100)
                    
                    LC.after(0, incremente)
                    
                    # ce qui pose problème ???
                    #a = LC.get()
                    #LE.config(text=LC.get())
                    
                    Mafenetre.mainloop()

                    Voilà. Dans la fonction 'incremente', j'affiche la valeur de compteur. Je voudrais cette valeur HORS de la fonction. ????

                    Merci

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Faire boucler indéfiniment une tempo

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown