development

파이썬이 눌린 키를 기다리도록하려면 어떻게합니까

big-blog 2020. 2. 13. 00:50
반응형

파이썬이 눌린 키를 기다리도록하려면 어떻게합니까


사용자가 키를 누를 때까지 스크립트가 대기하기를 원합니다.

어떻게해야합니까?


파이썬 3에는 raw_input()존재 하지 않습니다. 따라서 다음을 사용하십시오.

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

Python 2에서는 다음 raw_input()과 같은 을 사용해야 input(prompt)합니다 eval(raw_input(prompt)).

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

이것은 사용자가 Enter 키를 누를 때까지만 기다리므로 msvcrt 를 사용하고 싶을 수도 있습니다 ((Windows / DOS에만 해당) msvcrt 모듈을 사용하면 MSVCRT (Microsoft Visual C / C ++ Runtime Library)의 여러 기능에 액세스 할 수 있습니다).

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

키를 누를 때까지 기다려야합니다.


Python 2에서이를 수행하는 한 가지 방법은 다음을 사용하는 것입니다 raw_input().

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

python3에서 그것은 단지 input()


내 리눅스 상자에서 다음 코드를 사용합니다. 이것은 다른 곳에서 보았던 코드와 비슷하지만 (예를 들어 오래된 파이썬 FAQ에서) 코드는이 코드가없는 단단한 루프에서 회전하고 코드가 이것을 설명하지 않는 이상한 코너 사례가 많이 있습니다. 코드는 않습니다.

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)

시스템 명령에 따라 괜찮다면 다음을 사용할 수 있습니다.

리눅스 :

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

윈도우 :

os.system("pause")

간단히 사용

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

구문 분석하는 동안 SyntaxError : EOF가 예상됩니다.

간단한 수정 사용 :

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

파이썬 매뉴얼 은 다음을 제공합니다.

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)

유스 케이스에 넣을 수 있습니다.


플랫폼 독립적 인 방법을 모르지만 Windows에서는 msvcrt 모듈을 사용하면 getch 함수를 사용할 수 있습니다.

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

mscvcrt에는 비 차단 kbhit () 함수도 포함되어 대기하지 않고 키를 눌렀는지 확인합니다 (해당 curses 함수가 있는지 확실하지 않음). UNIX에는 curses 패키지가 있지만 모든 화면 출력에 사용하지 않고 사용할 수 있는지 확실하지 않습니다. 이 코드는 UNIX에서 작동합니다.

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

curses.getch ()는 눌렀을 때와 동일한 출력을 갖도록 누른 키의 서수를 반환합니다.


크로스 플랫폼, 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

fctl / non-blocking을 제거하고 IOError필요하지 않았 으므로 블로킹을 제거 했습니다. 차단하기를 원하기 때문에이 코드를 사용하고 있습니다. ;)


Enter 키를 기다리려면 (사용자가 키보드를 두드리면 의도하지 않은 일이 발생하지 않습니다.)

sys.stdin.readline()

나는 파이썬을 처음 접했고 이미 여기에서 만들어진 가장 간단한 제안을 재현하기에는 너무 바보라고 생각하고있었습니다. 그것은 알아야 할 함정이 있음이 밝혀졌습니다.

파이썬 스크립트가 IDLE에서 실행될 때 일부 IO 명령은 실제로 터미널 창이 없기 때문에 완전히 다른 것처럼 보입니다.

예 : msvcrt.getch는 비 블로킹이며 항상 $ ff를 반환합니다. 이것은 이미 오래 전에보고 된 바 있습니다 (예 : https://bugs.python.org/issue9290 참조 )-수정 된 것으로 표시되어 있습니다. 어떻게 든 문제가 현재 버전의 python / IDLE에서 지속되는 것으로 보입니다.

따라서 위에 게시 된 코드 중 하나라도 작동하지 않으면 IDLE이 아니라 스크립트를 수동으로 실행하십시오 .


그들이 정확한 키를 눌렀는지 확인하려면 ( 'b'와 같이) 이렇게하십시오 :

while True:
    choice = raw_input("> ")

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

os.system은 항상 sh를 호출하는 것으로 보이며, 읽기에 대한 s 및 n 옵션을 인식하지 못합니다. 그러나 읽기 명령은 bash로 전달 될 수 있습니다.

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

참고 URL : https://stackoverflow.com/questions/983354/how-do-i-make-python-to-wait-for-a-pressed-key



반응형