将转义键视为操作而不是Python输入中的字符

时间:2013-09-15 14:03:28

标签: python python-3.x

命令行应用程序中,我使用以下代码(来自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") (或等效的),则函数返回yesTrue返回no。如果他们只是按False,则会选择Enter值。

但是,如果用户在键盘上按default,则会将其视为字符。是否有一种方法可以使函数在按下该键时返回ESC?我在自己的搜索中发现的一些结果似乎过于复杂或仅适用于某些操作系统。

1 个答案:

答案 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,直到获得EscReturn

注意:我没有指定一种方法来确定平台,因为有多种方法可以做到这一点,并且关于该主题的SO有很多答案。