2009-09-08 31 views
28

Làm cách nào để thực hiện "nhấn phím bất kỳ" (hoặc lấy tùy chọn trình đơn) bằng Python?Làm thế nào để làm "nhấn phím bất kỳ" trong python?

  • raw_input yêu cầu bạn phải trả lại.
  • Windows msvcrt có getch() và getche().

Có cách nào để thực hiện điều này bằng cách sử dụng libs chuẩn không?

+16

Phím "bất kỳ" ở đâu? Tôi không có một trên bàn phím của tôi –

+3

+1 cho sử dụng rõ ràng của một cliche. –

+2

@Patrick Tại sao bạn không có phím "một" trên bàn phím? Phần còn lại của các con số là tốt? Bạn đã mất "1"? Hoặc bạn tìm thấy nhập "1" thông qua tổ hợp phím ASCII thú vị? – AneesAhmed777

Trả lời

31
try: 
    # Win32 
    from msvcrt import getch 
except ImportError: 
    # UNIX 
    def getch(): 
     import sys, tty, termios 
     fd = sys.stdin.fileno() 
     old = termios.tcgetattr(fd) 
     try: 
      tty.setraw(fd) 
      return sys.stdin.read(1) 
     finally: 
      termios.tcsetattr(fd, termios.TCSADRAIN, old) 
+0

Hãy thử chạy nó từ một IDE dưới Linux và bạn sẽ nhận được 'termios.error: (22, 'đối số không hợp lệ')'. isatty() không an toàn! – sorin

+0

Không 'termios' ngụ ý rằng nó chạy từ một thiết bị đầu cuối (một' tty' nếu bạn sẽ)? –

+1

điều này không có sự thay đổi/kiểm soát/vv Bạn có biết một cách để làm điều đó không? – Mala

4

Từ python docs:

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", `c` 
     except IOError: pass 
finally: 
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) 
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) 

này chỉ làm việc cho Unix biến thể mặc dù. Tôi không nghĩ rằng có một cách đa nền tảng.

+0

Đây phải là giải pháp. –

9
try: 
    os.system('pause') #windows, doesn't require enter 
except whatever_it_is: 
    os.system('read -p "Press any key to continue"') #linux 
+0

-1 cho hệ thống ('tạm dừng') – ntcong

+1

+1 cho nó là một giải pháp đơn giản, có lẽ đủ tốt cho 90% của tất cả các trường hợp. – Rook

+1

cần nhập. – nosklo

0

trên nền tảng Linux, tôi sử dụng os.system gọi /sbin/getkey lệnh, ví dụ

continue_ = os.system('/sbin/getkey -m "Please any key within %d seconds to continue..." -c 10') 
if continue_: 
    ... 
else: 
    ... 

Lợi ích là nó sẽ hiển thị thời gian đếm ngược giây để dùng, rất thú vị :)

2

Một vài năm trước, tôi đã viết một thư viện nhỏ để làm điều này một cách cross-platform (lấy cảm hứng trực tiếp bởi John Câu trả lời của Millikin ở trên). Ngoài getch, nó đi kèm với một chức năng pause rằng in 'Press any key to continue . . .':

pause() 

Bạn có thể cung cấp một thông báo tùy chỉnh quá:

pause('Hit any key') 

Nếu bước tiếp theo là để thoát ra, nó cũng đi kèm với một chức năng thuận tiện mà các cuộc gọi sys.exit(status):

pause_exit(status=0, message='Hit any key') 

Install với pip install py-getch, hoặc check it out here.

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