Partage
  • Partager sur Facebook
  • Partager sur Twitter

POO : "Demander" arrêt d'un boucle !?

Sujet résolu
    12 janvier 2018 à 18:45:13

    Bonjour,

    Je suis en train d'apprendre le python et par la même la programmation objet. 

    Voici mon problème : 

    J'ai une classe qui se nomme Feudesignalisation. Cette classe comme son nom l'indique gère les feux de signalisation. 

    J'ai deux méthodes d'instance qui se charge soit de faire fonctionner le feu normalement, c'est à dire vert (5') puis orange (1') et rouge (5') et ainsi de suite (While true) et j'ai une autre méthode qui se charge de le passe en clignotant orange. Quand je l'instancie et luis passe la méthode clignotante, vu qu'il y a une boucle, je ne peux plus le repasse en mode de fonctionnement normal.

    Ma question est : Comment passé à la méthode un signal d'arrêt à la boucle  pour swichter ou passer à la prochaine instruction ? 

    Voici une partie du code. Merci pour votre aide. 

    Je répète que je débute donc le code peu être un peu moisie pour les puristes. 

    Damien.

    --

    # Constructeur
    
    def __init__(self, position):
    
         super(Feudesignalisation, self).__init__()
    
         self.hauteur = 1
    
         self.couleur = 1
    
         self.position = position
    
         Feudesignalisation.nbr_feu += 1
    
    
    
    def cycle(self):
    
        while True:
    
            for self.couleur in range(4):
    
              self.couleur += 1
    
              if self.couleur == 1:
    
                   print ("Le feu est vert. Vous pouvez passer!")
    
                   time.sleep(5)
    
              if self.couleur == 2:
    
                   print ("Le feu est orange. Vous devez ralentir!")
    
                   time.sleep(2)
    
              if self.couleur == 3:
    
                   print ("Le feu est rouge. Vous devez vous arreter!")
    
                   time.sleep(5)
    
              if self.couleur == 4:
    
                   self.couleur = 1
    
    
    
              def setclignote(self):
    
                   self.couleur = 2
    
                   print ("Le feu est clignotant")
    
                   while True:
    
                        for self.couleur in range(3):
    
                             self.couleur += 1
         
                             if self.couleur == 1:
    
                                  print ("Le feu est orange !")
    
                                  time.sleep(1)
    
                             if self.couleur == 2:
    
                                  print ("Le feu est éteint !")
    
                                  time.sleep(1)
    
                             if self.couleur == 3:
    
                                  self.couleur = 1
    
    
    
    feu1 = Feudesignalisation(0)
    
    feu1.cycle() # Ici ca boucle.  Normal !! mais comment sortir de cette boucle pour passer en clignotant? 
    
    feu1.setclignote()



    -
    Edité par DamienGILLES 12 janvier 2018 à 18:52:47

    • Partager sur Facebook
    • Partager sur Twitter
      12 janvier 2018 à 21:29:09

      Plusieurs solutions se proposent: Soit tu modifies le while true ,car vu que c est toujours correct ca n arrete pas de boucler et tu mets autre chose comme une condition ou sinon tu laisses le while true et tu mets un break mais le propre n est pas trop propre apres.
      • Partager sur Facebook
      • Partager sur Twitter
      Salut c'est moi the geoffrey.
        13 janvier 2018 à 18:13:45

        Salut Geoffrey,

        Je vais essayer de modifier le while true. J'ai pensé aussi au multi thread. A méditer.

        Merci encore pour ton retour.

        Damien

        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2018 à 19:27:32

          Une piste potentielle à explorer, la seule différence entre les 2 modes de fonctionnement sont les durées :

          • normal => vert 5, orange 1, rouge 5, éteint 0
          • clignotant => vert 0, orange 1, rouge 0, éteint 1
          • Partager sur Facebook
          • Partager sur Twitter
          Censément, quelqu'un de sensé est censé s'exprimer sensément.
            14 janvier 2018 à 11:03:07

            Salut,

            Je sais pas si cela peut aider, mais puisque vous êtes dans une classe, vous avez qu'à créer une variable... Comme cela vous pourrez l'arrêter quand bon vous semblera.

            Exemple:

            class MaClasse(object):
                def __init__(self):
                    self.running = False
            
                def mainloop(self):
                    self.running = True
                    while self.running:
                        ...
            
            cls = MaClasse()
            cls.mainloop() ## Démarrage de la boucle..
            
            cls.running = False ## Fin de la boucle....

            Donc, qu'il soit en thread ou pas, lorsque vous mettez running à False, tout s'arrête...

            De plus, puisque running se met à True, dans la fonction mainloop(), vous pouvez recommencer cette boucle n'importe quand...

            Bonne chance

            A+

            • Partager sur Facebook
            • Partager sur Twitter
              15 janvier 2018 à 9:37:37

              Bonjour,

              Merci pour vos retours. 

              Sehnsucht : Effectivement, la durée est différente mais aussi le cycle des couleurs, pour le clignotant uniquement orange change d'état. Mais pas mal le faite d'ajouter les couleur et la durée dans un hash. Merci 

              nolimitech : Merci pour ce bout de code. Ca m'a l'air pas mal du tout. Je vais étudier cela. 

              A+

              • Partager sur Facebook
              • Partager sur Twitter
                15 janvier 2018 à 12:27:37

                DamienGILLES a écrit:

                Sehnsucht : Effectivement, la durée est différente mais aussi le cycle des couleurs, pour le clignotant uniquement orange change d'état.

                Je vois pas forcément où ça coince, en partant du principe que quand c'est 0s on affiche pas ; en bouclant dessus on a bien

                • vert 5s - orange 1s - rouge 5s et on redémarre, vert 5s etc.
                • orange 1s - éteint 1s et on redémarre, orange 1s - éteint 1s etc.

                De plus l'avantage c'est qu'ainsi le jour où il y a d'autres "programmes lumineux" ou qu'un existant change ; la modification est simple et c'est le genre de choses qui se stocke facilement en config.

                Note on est même pas obligé de mettre les éléments inutiles, selon la structure de donnée qu'on utilise on pourrait très bien imaginer un dictionnaire de liste de tuple [je tiens à préciser que je connais pas les structures de données dispos en Python] du genre

                {
                  normal     : [ (vert, 5); (orange, 1); (rouge 5) ]
                  clignotant : [ (orange, 1); (eteint, 1) ]
                }
                           

                ainsi quelque part on garde le "programme" actif (soit en tant que texte, soit directement sa liste/valeur) et dans ta boucle tu parcours ta liste en affichant chaque couleur listée, le temps correspondant

                • Partager sur Facebook
                • Partager sur Twitter
                Censément, quelqu'un de sensé est censé s'exprimer sensément.
                  17 janvier 2018 à 14:01:22

                  Bonjour,

                  Merci à tous pour vos réponses.

                  Avec tout ça j'ai pu m'en sortir. 

                  A + 

                  • Partager sur Facebook
                  • Partager sur Twitter

                  POO : "Demander" arrêt d'un boucle !?

                  × 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