Pergunta

Eu quero o meu script para esperar até que o usuário pressiona qualquer tecla.

Como posso fazer isso?

Foi útil?

Solução

Em Python 3, não existe raw_input(). Assim, apenas use:

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

Em Python 2, você deve usar raw_input(), como input(prompt) é equivalente a eval(raw_input(prompt)):

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

Isso só espera por um usuário pressione enter embora, assim você pode querer usar msvcrt ((Windows / DOS somente) O módulo msvcrt dá acesso a uma série de funções na Microsoft Visual C / C ++ Runtime Library (MSVCRT)):

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

Isso deve esperar por uma tecla.

Outras dicas

Uma maneira de fazer isso em Python 2, é usar raw_input():

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

Em python3 é apenas input()

Em minha caixa de linux, eu uso o código a seguir. Isto é semelhante ao código que eu vi em outro lugar (nos velhos FAQs python por exemplo), mas que o código gira em um loop apertado, onde este código não faz e existem muitos casos de canto ímpares que o código não leva em conta que este código faz.

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 a tuple of characters of the key that was pressed - on Linux, 
    pressing keys like up arrow results in a sequence of characters. Returns 
    ('\x03',) 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
    ret = []
    try:
        ret.append(sys.stdin.read(1)) # returns a single character
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
        c = sys.stdin.read(1) # returns a single character
        while len(c) > 0:
            ret.append(c)
            c = sys.stdin.read(1)
    except KeyboardInterrupt:
        ret.append('\x03')
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return tuple(ret)

Se você estiver ok com dependendo de comandos do sistema, você pode usar o seguinte:

Linux:

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

Windows:

os.system("pause")

Simplesmente usando

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

causará um SyntaxError:. Esperado EOF ao analisar

correção uso simples:

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

O python Manual fornece o seguinte:

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)

que podem ser enroladas em seu caso de uso.

Eu não sei de uma maneira independente de plataforma de fazê-lo, mas no Windows, se você usar o módulo msvcrt, você pode usar a sua função getch:

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

mscvcrt também inclui a função kbhit sem bloqueio () para ver se uma tecla foi pressionada sem esperar (não tenho certeza se há uma função maldições correspondente). Sob UNIX, há o pacote de maldições, mas não tenho certeza se você pode usá-lo sem usá-lo para toda a saída de tela. Esse código funciona em UNIX:

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

Note que curses.getch () retorna o ordinal da tecla pressionada por assim fazê-lo ter a mesma saída que eu tinha que lançá-lo.

Cross Platform, Python 2/3 código:

# 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

Eu removi o FCTL / non-blocking coisas porque estava dando IOErrors e eu não precisar dele. Estou usando este código especificamente porque eu quero-o para bloquear. ;)

Se você quiser esperar para entrar (para que o usuário batendo o teclado não causa algo un-destina a acontecer) utilização

sys.stdin.readline()

Eu sou novo para python e eu já estava pensando que eu sou burro demais para reproduzir as sugestões mais simples feitas aqui. Acontece que, há uma armadilha deve-se saber:

Quando um python-script é executado a partir IDLE, alguns IO-comandos parecem se comportar completamente diferente (como não há realmente nenhuma janela terminal).

Por exemplo. msvcrt.getch é non-blocking e sempre retorna $ ff. Isso já foi relatado há muito tempo (ver, por exemplo https://bugs.python.org/issue9290 ) - e é marcado como fixo, de alguma forma, o problema parece persistir nas versões atuais do python / IDLE.

Assim, se qualquer do código postado acima não funciona para você, tente executar o script manualmente, e NÃO de IDLE .

Se você quiser ver se eles pressionado a chave exata (como dizem 'b') Faça o seguinte:

while True:
    choice = raw_input("> ")

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

os.system parece sempre invocar sh, que não reconhece os s e n opções para leitura. No entanto, o comando de leitura pode ser passado para bash:

 os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top