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 cách nào để làm cho python chờ một phím bấm
Tôi làm như thế nào?
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 cách nào để làm cho python chờ một phím bấm
Tôi làm như thế nào?
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.
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()
Đ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
[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
http://stackoverflow.com/questions/1394956/how-to-do-hit-any-key-in-python –
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.
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
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
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
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.
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
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
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
Đây có lẽ là một trong những câu trả lời hữu ích nhất trên SO. – cat
@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
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
Đ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. –
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")
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..."'""")
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. –
Đơ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
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
Đ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. –
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. –
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")
Đ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. –
Nó làm tôi cười nhưng không giúp đỡ ai cả. –
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. ;)
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.
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 " –
@ richard, nhiều người sử dụng Windows, vì vậy +1. – Solarsaturn9
@ 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. –