2009-06-11 16 views

Trả lời

280

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...") 

này chỉ chờ đợi cho người dùng nhấn enter mặc dù, vì vậy bạn có thể muốn sử dụng MSVCRT ((Windows/DOS chỉ) Các module MSVCRT cung cấp cho 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ờ đợi một lần nhấn phím.

+39

Tôi nhận được lỗi này khi tôi cố gắng làm điều này trong Python 2.7: "SyntaxError: EOF bất ngờ trong khi phân tích cú pháp " –

+0

@ richard, nhiều người sử dụng Windows, vì vậy +1. – Solarsaturn9

+6

@ Solarsaturn9 và số lượng ngày càng lớn thì không. Do đó câu trả lời này không hiệu quả với tôi, và nhiều câu trả lời khác đến đây. –

271

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()

+14

Điều gì sẽ xảy ra khi nó có thể là một trong một số khóa? Không chỉ 'enter'? – noio

+32

[Với Python 3+] (http://stackoverflow.com/questions/954834/easy-how-to-use-raw-input-in-3-1), điều này đã thay đổi thành chỉ 'đầu vào()'. – palswim

+2

http://stackoverflow.com/questions/1394956/how-to-do-hit-any-key-in-python –

14

Các python manual 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) 

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

+10

Thực hành tốt là sao chép thứ bạn đang liên kết để kiến ​​thức vẫn còn, ngay cả khi liên kết chết (và họ làm!). – Richard

+1

Làm thế nào tôi có thể thực hiện công việc này bằng Python 3.x? Trong 3.x, sau khi thay đổi lệnh in tương thích, vòng lặp này chỉ vô hạn và không đợi đầu vào. Mặc dù vậy, nó hoạt động tốt trong Python 2. – cat

+0

Liên kết đã được cập nhật để chuyển hướng đến một trang khác. Liên kết mới là [ở đây.] (Https://docs.python.org/2/faq/library.html # how-do-i-get-a-single-keypress-at-a-time) – Matthias

11

Tôi không biết của một nền tảng cách độc lập để làm việc đó, nhưng trong môi trường Windows, nếu bạn sử dụng các module 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 các non-blocking kbhit() chức năng để xem nếu một phím đã được nhấn mà không cần chờ đợi (không chắc chắn nếu có một hàm curses tương ứng). Theo UNIX, có gói curses, nhưng không chắc chắn nếu bạn có thể sử dụng nó mà không sử dụng nó cho tất cả các đầu ra màn hình. Mã này hoạt động dưới UNIX:

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

Lưu ý rằng curses.getch() trả về thứ tự của phím được nhấn để làm cho nó có cùng kết quả mà tôi đã truyền.

+0

Sử dụng các lời nguyền đẹp hơn rất nhiều so với các ví dụ khá phức tạp được mô tả bằng sách hướng dẫn, ngay cả khi nó liên quan đến sự phụ thuộc lớn. +1 – Damian

37

Trên hộp Linux của tôi, tôi sử dụng mã sau đây. Điều này tương tự như mục nhập manual được đề cập ở nơi khác nhưng mã đó quay trong một vòng lặp chặt chẽ nơi mã này không và có rất nhiều trường hợp góc lẻ mà mã không tính đến mã này.

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 = 0 
    finally: 
     # restore old state 
     termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save) 
     fcntl.fcntl(fd, fcntl.F_SETFL, flags_save) 
    return ret 
+0

Mặc dù đây là câu trả lời yêu thích của tôi ở đây, giống như những câu hỏi khác không bắt được những thứ như thay đổi, kiểm soát, v.v. – Mala

+0

Đây có lẽ là một trong những câu trả lời hữu ích nhất trên SO. – cat

+1

@Mala mà khá nhiều là không thể trong Python tinh khiết; có lẽ bạn nên viết một mô-đun C? – cat

1

Nếu bạn muốn xem nếu họ nhấn một phím chính xác (như nói 'b') Làm điều này:

while True: 
    choice = raw_input("> ") 

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

Điều này yêu cầu người dùng nhập 'b' (hoặc cái gì khác) rồi nhấn enter, điều này hoàn toàn khác với những gì OP yêu cầu. –

22

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

Linux:

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

Windows:

os.system("pause") 
0

os.system dường như luôn gọi sh, không nhận ra các tùy chọn s và n để đọc.Tuy nhiên, lệnh đọc có thể được thông qua để bash:

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

Tài liệu đọc làm cho tôi nghĩ rằng nó sẽ không hết thời gian chờ trừ khi bạn chỉ định tùy chọn -t. –

15

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

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

sẽ gây ra một Lỗi Cú pháp: dự kiến ​​EOF khi phân tách.

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

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

Không sử dụng 'đầu vào' trong python 2 - hàm đúng là' raw_input'. Trong python 2, 'input' tương đương với' eval (raw_input()) '. – Blorgbeard

+0

Điều này bỏ qua tất cả các phím mà người dùng nhấn, cho đến khi họ nhấn enter, điều này hoàn toàn khác với những gì OP đang yêu cầu. –

+1

Ngoài ra, nếu bạn định sử dụng 'đầu vào', việc bắt SyntaxError là không thích hợp. Bất kể loại người dùng nào được đánh giá, vì vậy nếu, ví dụ, họ gõ "1/0" thì một ZeroDivisionError được nâng lên thay vì một Cú pháp Cú pháp, và chương trình của bạn sẽ thoát ra. –

-4

hoặc bạn có thể làm

print("This is a good joke") 
print("what happened when the chicken crossed the road") 
gap = input("") 
if gap == (""): 
    print("") 
else: 
    print("") 
print("it died") 
+2

Điều này bỏ qua tất cả các phím mà người dùng nhấn cho đến khi họ nhấn enter, điều này hoàn toàn khác so với những gì OP đang yêu cầu. –

+0

Nó làm tôi cười nhưng không giúp đỡ ai cả. –

10

Cross Platform, Python 2/3 mã:

# 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 loại bỏ các fctl/không công cụ bẻ khóa vì nó đã cho ra IOError và tôi đã không làm như vậy Tôi cần nó. Tôi đang sử dụng mã này đặc biệt vì tôi muốn nó chặn. ;)

2

Tôi mới làm quen với python và tôi đã nghĩ tôi quá ngu ngốc để tái tạo các đề xuất đơn giản nhất được thực hiện ở đây. Nó xuất hiện, có một điều đáng buồn nên biết:

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

Ví dụ: msvcrt.getch không bị chặn và luôn trả về $ ff. Điều này đã được báo cáo từ lâu (xem ví dụ https://bugs.python.org/issue9290) - và nó được đánh dấu là cố định, bằng cách nào đó vấn đề dường như 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 có tác dụng đối với bạn, hãy thử chạy tập lệnh theo cách thủ công và KHÔNG từ IDLE.

Các vấn đề liên quan