在命令行应用程序中,我使用以下代码(来自Andreas Renberg)向用户询问是/否问题(它只使用标准{{1 }}):
input
如果用户键入# Taken from http://code.activestate.com/recipes/577058-query-yesno/
# with some personal modifications
def yes_no(question, default=True):
valid = {"yes":True, "y":True, "ye":True,
"no":False, "n":False }
if default == None:
prompt = " [y/n] "
elif default == True:
prompt = " [Y/n] "
elif default == False:
prompt = " [y/N] "
else:
raise ValueError("invalid default answer: '%s'" % default)
while 1:
sys.stdout.write(question + prompt)
choice = input().lower()
if default is not None and choice == '':
return default
elif choice in valid.keys():
return valid[choice]
else:
sys.stdout.write("Please respond with 'yes' or 'no' "\
"(or 'y' or 'n').\n")
(或等效的),则函数返回yes
,True
返回no
。如果他们只是按False
,则会选择Enter
值。
但是,如果用户在键盘上按default
,则会将其视为字符。是否有一种方法可以使函数在按下该键时返回ESC
?我在自己的搜索中发现的一些结果似乎过于复杂或仅适用于某些操作系统。
答案 0 :(得分:0)
如果你想要抓住Esc
键盘按键,你必须实现类似getch
方法的方法,一次只能获得一个字符。
这是一个简单的实现。
if platform_is_windows:
from msvcrt import getch
elif platform_is_posix:
import sys
import tty
import termios
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
然后,您只需while
循环getch
,直到获得Esc
或Return
。
注意:我没有指定一种方法来确定平台,因为有多种方法可以做到这一点,并且关于该主题的SO有很多答案。