Comment faire en sorte que python attende une touche enfoncée

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

Comment puis-je faire ça?

387
demandé sur rayryeng 2009-06-12 00:09:19

11 réponses

En Python 3, Aucun raw_input() n'existe. Donc, il suffit d'utiliser:

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

Cela attend seulement qu'un utilisateur appuie sur Entrée, donc vous pouvez utiliser msvcrt ((Windows/DOS uniquement) le module msvcrt vous donne accès à un certain nombre de fonctions dans la bibliothèque D'exécution Microsoft Visual C/C++ (MSVCRT)):

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

Cela devrait attendre un appui sur une touche.

338
répondu riza 2015-10-21 19:12:40

Un moyen de le faire en Python 2, est d'utiliser raw_input():

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

Dans python3 c'est juste input()

292
répondu Greg Hewgill 2016-08-27 14:45:09

Sur ma boîte linux, j'utilise le code suivant. Ceci est similaire à l'entrée manual mentionnée ailleurs, mais ce code tourne dans une boucle serrée où ce code ne le fait pas et il y a beaucoup de cas de coin impairs que le code ne tient pas compte de ce code.

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
43
répondu mheyman 2018-08-23 13:32:13

Si vous êtes ok avec en fonction des commandes du système, vous pouvez utiliser ce qui suit:

Linux:

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

Fenêtres:

os.system("pause")
24
répondu CrouZ 2013-06-05 06:36:48

Simplement en utilisant

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

Provoquera une SyntaxError: expected EOF lors de l'analyse.

Utilisation simple de correction:

try:
    input("Press enter to continue")
except SyntaxError:
    pass
19
répondu alltrue 2014-03-03 16:06:30

Le manuel python fournit ce qui suit:

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 roulé dans votre cas d'utilisation.

14
répondu Jaap Versteegh 2012-11-01 19:10:35

Je ne connais pas de manière 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 kbhit () non bloquante pour voir si une touche a été pressée sans attendre (pas sûr qu'il y ait une fonction curses correspondante). Sous UNIX, il y a le paquet curses, mais je ne sais pas si vous pouvez l'utiliser sans l'utiliser pour toute la sortie de l'écran. Ce code fonctionne sous UNIX:

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

Notez que malédiction.getch () renvoie l'ordinal de la touche enfoncée afin de lui donner la même sortie que j'ai dû la lancer.

13
répondu John Gaines Jr. 2011-05-17 21:42:22

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 supprimé les trucs fctl/non bloquants parce qu'ils donnaient IOError s et je n'en avais pas besoin. J'utilise ce code spécifiquement parce que je veux le bloquer. ;)

12
répondu Gringo Suave 2016-01-22 22:10:39

Je suis nouveau en 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 y a un piège que l'on devrait savoir:

Lorsqu'un script python est exécuté à partir D'IDLE, certaines commandes D'E / S semblent se comporter complètement différemment (car il n'y a pas de fenêtre de terminal).

Par exemple. msvcrt.getch est non bloquant et renvoie toujours $ ff. Cela a déjà été rapporté il y a longtemps (voir par exemple https://bugs.python.org/issue9290 ) - et c'est marqué comme corrigé, le problème semble persister dans les versions actuelles de Python / IDLE.

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

2
répondu ralfiii 2016-07-28 21:47:58

Si vous voulez voir s'ils ont appuyé sur une touche exacte (comme dire 'b'), faites ceci:

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break
1
répondu E40 2013-08-07 22:33:24

Os.le système semble toujours invoquer sh, qui ne reconnaît pas les options s et n Pour la lecture. Cependant, la commande read peut être passée à bash:

 os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
0
répondu James King 2014-04-07 11:40:53