web-dev-qa-db-fra.com

Comment puis-je faire python pour attendre une touche appuyée

Je veux que mon script attende que l'utilisateur appuie sur une touche quelconque.

Comment je fais ça?

419
Janusz

En Python 3, aucune raw_input() n'existe. Alors, utilisez simplement:

input("Press Enter to continue...")

Cela n’attend que si un utilisateur appuie sur Entrée, vous pouvez donc utiliser msvcrt ((Windows/DOS uniquement). Le module msvcrt vous donne accès à un certain nombre de fonctions de la bibliothèque d’exécution Microsoft Visual C/C++ ( MSVCRT)):

import msvcrt as m
def wait():
    m.getch()

Cela devrait attendre une pression sur une touche.

372
riza

Une façon de le faire dans Python 2 consiste à utiliser raw_input():

raw_input("Press Enter to continue...")

En python3, c'est juste input()

310
Greg Hewgill

Sur ma boîte Linux, j'utilise le code suivant. Ceci est similaire à l'entrée manual mentionnée ailleurs, mais le code tourne dans une boucle serrée où ce code ne correspond pas et où il existe de nombreux cas de coins étranges que le code ne prend pas en compte.

def read_single_keypress():
    """Waits for a single keypress on stdin.

    This is a silly function to call if you need to do it a lot because it has
    to store stdin's current setup, setup stdin for reading single keystrokes
    then read the single keystroke then revert stdin back after reading the
    keystroke.

    Returns the character of the key that was pressed (zero on
    KeyboardInterrupt which can happen when a signal gets handled)

    """
    import termios, fcntl, sys, os
    fd = sys.stdin.fileno()
    # save old state
    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
    attrs_save = termios.tcgetattr(fd)
    # make raw - the way to do this comes from the termios(3) man page.
    attrs = list(attrs_save) # copy the stored version to update
    # iflag
    attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK 
                  | termios.ISTRIP | termios.INLCR | termios. IGNCR 
                  | termios.ICRNL | termios.IXON )
    # oflag
    attrs[1] &= ~termios.OPOST
    # cflag
    attrs[2] &= ~(termios.CSIZE | termios. PARENB)
    attrs[2] |= termios.CS8
    # lflag
    attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                  | termios.ISIG | termios.IEXTEN)
    termios.tcsetattr(fd, termios.TCSANOW, attrs)
    # turn off non-blocking
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
    # read a single keystroke
    try:
        ret = sys.stdin.read(1) # returns a single character
    except KeyboardInterrupt: 
        ret = '\x03'
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return ret
48
mheyman

Si vous êtes d'accord avec en fonction des commandes système, vous pouvez utiliser les éléments suivants:

Linux:

os.system('read -s -n 1 -p "Press any key to continue..."')
print

Les fenêtres:

os.system("pause")
25
CrouZ

Simplement en utilisant

input("Press Enter to continue...")

provoquera une SyntaxError: attendue EOF lors de l'analyse.

Utilisation simple du correctif:

try:
    input("Press enter to continue")
except SyntaxError:
    pass
21
alltrue

Le python manual fournit les éléments suivants:

import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", repr(c)
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

qui peut être intégré à votre cas d'utilisation.

14
Jaap Versteegh

Je ne connais pas de méthode indépendante de la plate-forme, mais sous Windows, si vous utilisez le module msvcrt, vous pouvez utiliser sa fonction getch:

import msvcrt
c = msvcrt.getch()
print 'you entered', c

mscvcrt inclut également la fonction non bloquante kbhit () pour voir si une touche a été enfoncée sans attendre (vous ne savez pas s'il existe une fonction curses correspondante). Sous UNIX, il y a le paquet curses, mais vous ne savez pas si vous pouvez l'utiliser sans l'utiliser pour toutes les sorties d'écran. Ce code fonctionne sous UNIX:

import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()

Notez que curses.getch () renvoie l'ordinal de la touche enfoncée afin de lui donner le même résultat que celui que je devais le lancer.

13
John Gaines Jr.

Cross Platform, code Python 2/3:

# import sys, os

def wait_key():
    ''' Wait for a key press on the console and return it. '''
    result = None
    if os.name == 'nt':
        import msvcrt
        result = msvcrt.getch()
    else:
        import termios
        fd = sys.stdin.fileno()

        oldterm = termios.tcgetattr(fd)
        newattr = termios.tcgetattr(fd)
        newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
        termios.tcsetattr(fd, termios.TCSANOW, newattr)

        try:
            result = sys.stdin.read(1)
        except IOError:
            pass
        finally:
            termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)

    return result

J'ai enlevé le fctl/non-bloquant parce qu'il donnait IOErrors et je n'en avais pas besoin. J'utilise ce code spécifiquement parce que je veux le bloquer. ;)

12
Gringo Suave

Je suis nouveau sur Python et je pensais déjà que je suis trop stupide pour reproduire les suggestions les plus simples faites ici ..__ Il s’avère qu’il ya un écueil qu’il faut connaître:

Lorsqu'un script python est exécuté à partir d'IDLE, certaines commandes IO semblent se comporter de manière complètement différente (car il n'y a en réalité aucune fenêtre de terminal).

Par exemple. msvcrt.getch ne bloque pas et retourne toujours $ ff . Cela a déjà été rapporté il y a longtemps (voir par exemple https://bugs.python.org/issue9290 ) - et il est marqué comme étant corrigé, d'une manière ou d'une autre le problème semble persister dans les versions actuelles de python/IDLE.

Ainsi, si l'un des codes publiés ci-dessus ne fonctionne pas pour vous, essayez d'exécuter le script manuellement et NOT à partir de IDLE.

2
ralfiii

Si vous voulez voir s'ils ont appuyé sur une touche exacte (comme par exemple 'b'), procédez comme suit:

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break
1
E40

os.system semble toujours invoquer sh, qui ne reconnaît pas les options s et n pour la lecture. Cependant, la commande de lecture peut être passée à bash: 

 os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
0
James King

Si vous voulez attendre pour entrer (pour que l'utilisateur ne frappe pas au clavier, rien ne se produise), utilisez

sys.stdin.readline()
0
andrew pate