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 :

Récupérer les entrées clavier en temps réel


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut Récupérer les entrées clavier en temps réel
    Bonjour,
    Dans mon terminal python j'ai besoin de récupérer en temps réel les entrée clavier.
    Je ne peut pas passer par raw_input car je veut faire comme dans un vrai terminal c'est à dire que quand on a la flèche haute qui est appuyée on est la commande précédente, etc...
    Comment faire?
    Merci d'avance!

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu peux garder les entrées dans une liste et la parcourir lors des entrées flêche-haut flêche-bas.

    Mais tu seras aussi confronté a divers problèmes d'édition, effacement d'une ligne, saut de ligne, etc.

    Le module Curse te permettra de faire quelque chose de propre.
    https://docs.python.org/3/library/curses.html

    Il y a aussi un tuto.
    https://docs.python.org/3/howto/curs...l#curses-howto

  3. #3
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut
    Merci pour votre réponse.
    J'ai utiliser le tutos de python sauf que j'ai un problème...

    1. Il faut que je tape sur Entrée pour qu'il reconnaisse ma touche
    2. L'interface graphique de mon programme est modifiée et je ne vois plus ce que je tape dans la console python...

    Voilà 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
    def CURSES():
        action = curses.initscr()
        curses.noecho()
        curses.cbreak()
        action.keypad(1)
     
     
        while True:
            command = action.getch()
            if command == ord("^[[A"):
                print("Haut")
            elif command == ord("^[[B"):
                print("Bas")
     
     
        curses.nocbreak(); action.keypad(0); curses.echo()
        curses.endwin()
    Merci.

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Essaye plutôt comme ceci:
    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
     
    #-*- coding: utf-8 -*-
     
    import curses
     
    def CURSES():
        action = curses.initscr()
        curses.noecho()
        curses.cbreak()
        action.keypad(1)
     
     
        while True:
            try:
                key = action.getkey()
                print("\r%s" % key)
                if key in ("q", "Q"):
                    break
            except Exception as why:
                print("\r%s" % why)
                break
     
        curses.nocbreak(); action.keypad(0); curses.echo()
        curses.endwin()
     
    CURSES()
    Il faut utiliser un bloc try-except sinon en cas de plantage ton terminal ne sera pas remit en état.

    Edit:
    J'ai testé le CTRL+C et, étrangement, cette interruption n'est pas captée dans le bloc try-except.
    Il faut donc l'ajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            except KeyboardInterrupt:
                break

  5. #5
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut
    Cela ne fonctionne malheureusement toujours pas...
    J'ai mon fichier principal qui exécute (ce qui nous intéresse) ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #Modules Systeme
    import SYS.__init__
     
    boucle = True
    while boucle == True:                    #Boucle qui fait tourner le programme
        SYS.__init__.CURSES()                                                    #Revenir à des anciennes commandes
     
        com = raw_input("{0}> ".format(espace*" "))
    Ce qui appelle cette fonction:
    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
    def CURSES():
        action = curses.initscr()
        curses.noecho()
        curses.cbreak()
        action.keypad(1)
     
        while True:
            try:
                command = action.getch()
                if command == ord("^[[A"):
                    print("Haut")
                elif command == ord("^[[B"):
                    print("Bas")
            except Exception as why:
                print("\r%s" % why)
            except KeybordInterrupt:
                break
     
        curses.nocbreak(); action.keypad(0); curses.echo()
        curses.endwin()
    Mais voilà le retour de mon terminal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ord() expected a character, but string of length 4 foundord() expected a character, but string of length 4 found
    ord() expected a character, but string of length 4 found
    ord() expected a character, but string of length 4 found
    ord() expected a character, but string of length 4 found
    ord() expected a character, but string of length 4 found
    ord() expected a character, but string of length 4 found
    ord() expected a character, but string of length 4 found
                                                            Traceback (most recent call last):
              File "LSF.py", line 76, in <module>
                                                     SYS.__init__.CURSES()            #Revenir à des anciennes commandes
                                       File "/home/adrien/Documents/hubiC/LSF/25.10.2017/Prog/SYS/__init__.py", line 145, in CURSES
                                                     except KeybordInterrupt:
                                                                             NameError: global name 'KeybordInterrupt' is not defined
                                                   adrien@ADRIEN-ASUS1 ~/Documents/hubiC/LSF/25.10.2017/Prog $
    Je précise que les tabulations sont celles qui sont affichées dans le terminal...

    Voilà, merci beaucoup de m'aider!

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Le message d'erreur est clair: ord() demande un argument d'un caractère, pas une chaîne de quatre.

    C'est pourquoi j'ai utilisé getkey() plutôt que getch().

    La deuxième erreur c'est parce que Keyboard s'écrit avec un a

    Les tabulations sont dues au fait que l'éditeur maintient sa dernière position connue et c'est pour cette raison que j'ai commencé les print par "\r" qui a pour effet de ramener le curseur au début de la ligne.

    Chez moi (Linux) mon code fonctionne parfaitement.

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/02/2011, 18h15
  2. [SWING] gérer les entrées clavier à un seul endroit
    Par Isher dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 19/07/2006, 10h55
  3. Réponses: 2
    Dernier message: 01/12/2005, 12h24
  4. [Entrée standard] Prendre les entrées clavier.
    Par Katyucha dans le forum Langage
    Réponses: 4
    Dernier message: 19/09/2005, 12h22
  5. Réponses: 3
    Dernier message: 04/02/2004, 18h35

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