2016-04-08 7 views
0

Je suis très novice en python et en programmation et je veux imprimer la chaîne "forward" à chaque fois que j'appuie sur "w" sur le clavier. C'est un test que je vais transformer en télécommande pour un véhicule motorisé. Pourquoi est-ce que j'imprime simplement chaque touche que je tape?si la déclaration incluant raw_input ne fait qu'imprimer ce que je tape sur le clavier

+0

L'indentation est faux, mais si vous mettez en retrait avant la deuxième ligne à nouveau sur la troisième ligne, cela devrait fonctionner. –

+0

J'ai généralement indenté l'instruction if dans mon code. Je ne sais pas pourquoi cela n'apparaît pas comme ça dans le bloc de code. Si je le fais sinon je reçois une erreur d'indentation de toute façon. – Lujeen

Répondre

2

En Python 2.x, la fonction raw_input affichera tous les caractères appuyés et retournera à la réception d'un retour à la ligne. Si vous voulez un comportement différent, vous devrez utiliser une fonction différente. Voici une version portable de getch pour Python, il retournera chaque pression de touche:

# Copied from: stackoverflow.com/questions/510357/python-read-a-single-character-from-the-user 
def _find_getch(): 
    try: 
        import termios 
    except ImportError: 
        # Non-POSIX. Return msvcrt's (Windows') getch. 
        import msvcrt 
        return msvcrt.getch 

    # POSIX system. Create and return a getch that manipulates the tty. 
    import sys, tty 
    def _getch(): 
        fd = sys.stdin.fileno() 
        old_settings = termios.tcgetattr(fd) 
        try: 
            tty.setraw(fd) 
            ch = sys.stdin.read(1) 
        finally: 
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
        return ch 

    return _getch 

getch = _find_getch() 

Il peut être utilisé comme ceci:

while True: 
    if getch() == "w": 
     print "forward" 
1

raw_input lit une ligne entière d'entrée. La ligne que vous êtes saisie est rendu visible pour vous, et vous pouvez faire des choses comme le type texte:

aiplanes 

aller à gauche quelques caractères pour corriger votre erreur typographique:

airplanes 

revenir à la fin et supprimer un caractère parce que vous ne vouliez pas faire au pluriel:

airplane 

et puis appuyez sur Entrée et raw_input sera retur n "airplane". Il ne revient pas immédiatement lorsque vous appuyez sur une touche du clavier.


Si vous voulez lire les clés individuelles, vous devrez utiliser les routines de contrôle terminal de niveau inférieur à prendre d'entrée. Sur Unix, le module curses serait un outil approprié; Je ne suis pas sûr de ce que vous utiliseriez sur Windows. Je ne l'ai pas fait auparavant, mais sous Unix, je pense que vous devez configurer le terminal en mode brut ou en mode rupture et prendre l'entrée avec window.getkey() ou window.getch(). Vous devrez peut-être désactiver l'écho avec curses.noecho(); Je ne suis pas sûr que ce soit inclus dans le mode raw/cbreak.