Helpex - Trao đổi & giúp đỡ Đăng nhập
430

Tôi muốn tập lệnh của mình đợi cho đến khi người dùng nhấn bất kỳ phím nào.

Làm thế nào để làm điều đó?

430 hữu ích 0 bình luận 697k xem chia sẻ
11 trả lời 11
382

Trong Python 3, không raw_input()tồn tại. Vì vậy, chỉ cần sử dụng:

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

Trong Python 2, bạn nên sử dụng raw_input(), input(prompt)tương đương với eval(raw_input(prompt)):

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

Điều này chỉ chờ người dùng nhấn enter, vì vậy bạn có thể muốn sử dụng msvcrt ((chỉ dành cho Windows / DOS) Mô-đun msvcrt cho phép bạn truy cập vào một số chức năng trong Thư viện thời gian chạy Microsoft Visual C / C ++ (MSVCRT)):

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

Điều này sẽ chờ cho một lần nhấn phím.

382 hữu ích 5 bình luận chia sẻ
311

Một cách để làm điều này trong Python 2, là sử dụng raw_input():

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

Trong python3, nó chỉ input()

311 hữu ích 4 bình luận chia sẻ
49

Trên hộp linux của tôi, tôi sử dụng mã sau đây. Mã này tương tự như mã tôi đã thấy ở nơi khác (ví dụ: trong Câu hỏi thường gặp về python cũ) nhưng mã đó quay vòng trong một vòng lặp chặt chẽ trong đó mã này không có và có rất nhiều trường hợp góc kỳ lạ mà mã không giải thích cho điều này mã nào.

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)
49 hữu ích 5 bình luận chia sẻ
26

Nếu bạn ổn với tùy thuộc vào lệnh hệ thống, bạn có thể sử dụng như sau:

Linux:

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

Các cửa sổ:

os.system("pause")
26 hữu ích 1 bình luận chia sẻ
21

Đơn giản chỉ cần sử dụng

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

sẽ gây ra một SyntaxError: EOF dự kiến ​​trong khi phân tích cú pháp.

Sử dụng sửa chữa đơn giản:

try:
    input("Press enter to continue")
except SyntaxError:
    pass
21 hữu ích 4 bình luận chia sẻ
14

Hướng dẫn python cung cấp như sau:

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)

có thể được đưa vào trường hợp sử dụng của bạn.

14 hữu ích 3 bình luận chia sẻ
13

Tôi không biết về cách thức hoạt động độc lập với nền tảng, nhưng trong Windows, nếu bạn sử dụng mô-đun msvcrt, bạn có thể sử dụng chức năng getch của nó:

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

mscvcrt cũng bao gồm hàm kbhit () không chặn để xem nếu một phím được nhấn mà không cần chờ đợi (không chắc có chức năng nguyền rủa tương ứng không). Trong UNIX, có gói lời nguyền, nhưng không chắc bạn có thể sử dụng nó mà không sử dụng nó cho tất cả đầu ra màn hình hay không. Mã này hoạt động theo UNIX:

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

Lưu ý rằng curses.getch () trả về số thứ tự của phím được nhấn để làm cho nó có cùng một đầu ra tôi phải bỏ nó.

13 hữu ích 1 bình luận chia sẻ
12

Nền tảng chéo, mã 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

Tôi đã xóa các công cụ fctl / không chặn bởi vì nó đang cho IOErrors và tôi không cần nó. Tôi đang sử dụng mã này đặc biệt bởi vì tôi muốn nó bị chặn. ;)

12 hữu ích 0 bình luận chia sẻ
2

Tôi chưa quen với python và tôi đã nghĩ rằng mình quá ngu ngốc khi sao chép những gợi ý đơn giản nhất được đưa ra ở đây. Hóa ra, có một cạm bẫy người ta nên biết:

Khi tập lệnh python được thực thi từ IDLE, một số lệnh IO dường như hoạt động hoàn toàn khác (vì thực tế không có cửa sổ đầu cuối).

Ví dụ. msvcrt.getch không chặn và luôn trả về $ ff. Điều này đã được báo cáo từ lâu (ví dụ: https://bugs.python.org/su9290 ) - và nó được đánh dấu là đã sửa, bằng cách nào đó, vấn đề dường như vẫn tồn tại trong các phiên bản hiện tại của python / IDLE.

Vì vậy, nếu bất kỳ mã nào được đăng ở trên không phù hợp với bạn, hãy thử chạy tập lệnh theo cách thủ công và KHÔNG từ IDLE .

2 hữu ích 0 bình luận chia sẻ
1

Nếu bạn muốn xem liệu họ có nhấn một phím chính xác không (như nói 'b') Thực hiện việc này:

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break
1 hữu ích 1 bình luận chia sẻ
1

Nếu bạn muốn đợi nhập (để người dùng gõ bàn phím không gây ra sự cố ngoài ý muốn), hãy sử dụng

sys.stdin.readline()
1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python wait keyboard-input , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading