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

Python Discussion :

sortie de boucle while [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Sans
    Inscrit en
    Juillet 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut sortie de boucle while
    Bonjour.
    Je cherches une astuce pour sortir proprement d'un boucle while, sans utiliser [Ctrl] + C
    Pour ça, je voudrais pouvoir appuyer sur une touche du clavier (pourquoi pas 'Q' ) et donc intercepter cette frappe à la volée.
    Je connais vaguement la commande print(), mais malheureusement elle arrête le script et attend une entrée de l'utilisateur avant de poursuivre...

    Une partie de mon code :
    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
     
    cpt = 0
    char = ""
    while (cpt < 10 and char != "q"):
        char = input()
     
        for i in range (1,100):
            print("Première boucle - Valeur de i:", i)
            p.ChangeDutyCycle(i)
            time.sleep(0.1)
     
     
        for i in range (100, 1, -1):
            print("Seconde boucle - Valeur de i:", i)
            p.ChangeDutyCycle(i)
            time.sleep(0.1)
     
     
         cpt += 1
    Le problème ici est évident : je dois rentrer quelque chose au clavier ( char = input() ) avant de poursuivre, ce qui n'est pas le but recherché.
    J'ai essayé d'utiliser break, sans succès.

    Une idée ?

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Tu peux utiliser Ctrl+C sans stopper ton programme.

    Exemple:
    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
     
    >>> import time
    >>> def func():
    ...     try:
    ...             for i in range(5000):
    ...                     print(i, end=' ')
    ...                     time.sleep(0.5)
    ...     except KeyboardInterrupt:
    ...             return
    ... 
    >>> while 1:
    ...     inp = input("Continue? ")
    ...     if inp.lower() == 'q':
    ...             break
    ...     func()
    ... 
    Continue? o
    ^C0 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 Continue? o
    ^C0 1 2 3 Continue? q
    >>>
    Une autre solution est d'utiliser un framework qui gère les signaux et autres événements.

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Une autre solution est de tester le clavier pour savoir si une touche a été frappée et est disponible à la lecture.

    Mais le code est spécifique à l'OS utilisé.
    - Pour Windows, on utilise le module "msvcrt".
    - Pour Unix (au moins Linux et peut-être OS X mais je n'ai pas essayé), on utilise le module "termios".

    C'est assez compliqué à coder! La solution avec "KeyboardInterrupt" est beaucoup plus simple.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Candidat au Club
    Homme Profil pro
    Sans
    Inscrit en
    Juillet 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses.
    Je pensais trouver un truc tout bête (Bash sous Linux le fait très simplement, sans importer de bibliothèques extérieures) mais là...
    La solution avec KeyboardInterrupt est intéressante mais elle fait appel à input() et Ctrl C, ce que souhaiterais éviter.
    J'ai jeté un oeil à termios, mais ça semble un peu barbare pour un newbie comme moi.
    Je regarde actuellement la bibliothèque curses et la fonction stdscr.getch()
    Je vous tiens informé dès que j'aurais digéré la chose...

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Sous linux (linuxmint v17 chez moi), je viens d'essayer le code d'ici:

    http://code.activestate.com/recipes/...bhit-on-linux/

    Une petite modernisation python 2 => 3 et ça marche très bien. La modernisation porte sur les print ('print ...' => 'print(...)') ainsi que l'opérateur de condition ('<>' => '!=').

    Un exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        while True:
            if kbhit():
                ch = getch()
                if ch=='q':
                    break
            sys.stdout.write('.')
     
        print('Fin')
    Le code parait compliqué, mais une fois au point, on le met en bibliothèque et on peut y faire référence à tout moment.

    NB: il s'agit d'une fonctionnalité prévue pour une console. Il n'est pas sûr que ça marche dans un outil de développement (idle, etc...).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Candidat au Club
    Homme Profil pro
    Sans
    Inscrit en
    Juillet 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    J'ai voulu tester ce code, en copiant le fichier kbhit.pi ( http://home.wlu.edu/~levys/software/kbhit.py )dans le même répertoire que mon fichier de test, modifié le code comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    import kbhit
     
    while True:
        if kbhit.kbhit():
            ch = getch()
            if ch=='q':
                break
            sys.stdout.write('.')
     
        print('Fin')
    Mais j'ai l'erreur :

    File "test-kbhit.py", line 8, in <module>
    if kbhit.kbhit():
    AttributeError: 'module' object has no attribute 'kbhit'


    Si j'utilise : , ça me retourne :

    TypeError: 'module' object is not callable

    je m'en sors pas...

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Avec le code dont tu donnes le lien, ça ne marche pas comme ça: kbhit est une des méthodes d'une classe "KBHit" qu'il faut instancier avant d'utiliser!

    Je n'ai pas essayé, mais ça devrait ressembler à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import kbhit
     
    clavier =  kbhit.KBHit()
    while True:
        if clavier.kbhit():
            ch = clavier.getch()
            if ch=='q':
                break
            sys.stdout.write('.')
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Candidat au Club
    Homme Profil pro
    Sans
    Inscrit en
    Juillet 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    BINGO !!!

    J'avais en effet complètement omis d'instancier la classe.
    Je viens de tester le script en intégrant d'autres commandes à l'intérieur de la boucle et ça fonctionne parfaitement.

    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
     
    #!/usr/lib/env python
     
    import kbhit, sys, time
    clavier = kbhit.KBHit()
    i = 0
     
    while (i < 100):
        print('coucou')
        time.sleep(0.5)
        if clavier.kbhit():
            ch = clavier.getch()
            if ch=='q':
                break
            sys.stdout.write('')
            i += 1
    Encore merci

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

Discussions similaires

  1. Sortie de boucle while impossible
    Par Econle dans le forum Langage
    Réponses: 3
    Dernier message: 11/05/2015, 00h21
  2. Réponses: 4
    Dernier message: 20/04/2010, 11h24
  3. Sortie boucle while et waveform
    Par gtkill dans le forum LabVIEW
    Réponses: 7
    Dernier message: 28/03/2010, 19h11
  4. [MFC] Dialog dans une boucle while
    Par oxor3 dans le forum MFC
    Réponses: 5
    Dernier message: 23/04/2004, 22h51
  5. [débutant]Documentation? boucle "while"? Session?
    Par o151181 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 19/01/2004, 15h20

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