Python 如何使用“esc”键在任意点结束程序/返回上一菜单?

Python 如何使用“esc”键在任意点结束程序/返回上一菜单?,python,python-3.7,sigint,Python,Python 3.7,Sigint,目前我有一个打开菜单的程序,用户可以选择一个选项并转到该功能。但是,如果在任何时候按下Esc键,则应返回上一个菜单或完全退出程序(如果它位于层次结构的顶部) 到目前为止,我已经让它工作,如果用户按下Esc键,然后点击enter,它将退出/或返回到上一个菜单。但是我想这样做,用户不必只按Esc键就可以输入。我曾尝试使用多处理库为主代码创建一个进程,但这会使输入函数无法处理程序所需的所有用户输入 def my_代码: 尽管如此: 普林塔。做点什么\n printb。做点什么\n printc。做点什

目前我有一个打开菜单的程序,用户可以选择一个选项并转到该功能。但是,如果在任何时候按下Esc键,则应返回上一个菜单或完全退出程序(如果它位于层次结构的顶部)

到目前为止,我已经让它工作,如果用户按下Esc键,然后点击enter,它将退出/或返回到上一个菜单。但是我想这样做,用户不必只按Esc键就可以输入。我曾尝试使用多处理库为主代码创建一个进程,但这会使输入函数无法处理程序所需的所有用户输入

def my_代码: 尽管如此: 普林塔。做点什么\n printb。做点什么\n printc。做点什么\n 打印。做点什么\n 普林特。做点什么\n printf。做点什么\n 打印。做点什么\n 选择=输入请选择选项a-g: 如果选项=='a'或选项=='a': 功能 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': p=多处理。Processtarget=my_代码 p、 开始 如果getch.getch='\x1b': os.killp.pid,signal.SIGINT 实际结果是,如果在任何一点按下Esc(如果在该菜单上),则程序应退出。但是当我运行这个时,我得到了一个错误

choice = input("Please pick an option (a-g):")
EOFError: EOF when reading a line

有没有更好的方法来实现这一点,而不是创建一个多处理线程?

使用键盘库等待按键

pip install keyboard
您可以在守护进程模式下使用线程来输入值

def function_a():
   print("call function_a")

def my_code():
    while True:
        print("a. do something\n")
        print("b. do something\n")
        print("c. do something\n")
        print("d. do something\n")
        print("e. do something\n")
        print("f. do something\n")
        print("g. do something\n")
        choice = input("Please pick an option (a-g):")

        if choice == 'a' or choice == 'A':
            function_a()

threading.Thread(target = my_code, daemon=True).start()
主线程将等待,直到按下Esc键,然后退出杀死主线程和守护线程

keyboard.wait("esc")
sys.exit()
完整示例:

import keyboard
import threading
import sys

def function_a():
   print("call function_a")

def my_code():
    while True:
        print("a. do something\n")
        print("b. do something\n")
        print("c. do something\n")
        print("d. do something\n")
        print("e. do something\n")
        print("f. do something\n")
        print("g. do something\n")
        choice = input("Please pick an option (a-g):")

        if choice == 'a' or choice == 'A':
            function_a()

my_thread = threading.Thread(target = my_code, daemon=True).start()
keyboard.wait("esc")
sys.exit()

如果在函数a中按下“esc”返回到我的代码,类似的操作是否也会起作用?对不起,我不明白您的要求。但是,只要您执行keyboard.waitesc,程序就会一直等到按下“esc”键。对不起,让我澄清一下,这样做基本上是可行的。如果在除my_code之外的任何函数中按下“esc”,它将返回my_code,如果它在my_code中,它将退出。哦,好的,我知道了。这要复杂得多,因为使用此解决方案时,您需要等待全局按下“esc”键。做你想做的事情可能需要几个线程或者一个事件系统或者一些更聪明的方法来完成几个嵌套的子菜单。如果我成功了,我会想办法让你知道