Как использовать клавишу «esc», чтобы завершить программу в любой момент / вернуться в предыдущее меню? - PullRequest
2 голосов
/ 16 июня 2019

В настоящее время у меня есть программа, которая открывается с меню, пользователь может выбрать опцию и перейти к этой функции. Однако, если в любой момент нажата клавиша Esc , она должна вернуться в предыдущее меню или полностью выйти из программы, если она находится в верхней части иерархии.

До сих пор у меня получилось, что если пользователь нажимает Esc , затем нажимает клавишу ввода, выходит из / или возвращается в предыдущее меню. Но я бы хотел сделать так, чтобы пользователю не приходилось нажимать клавишу ввода, только клавиша Esc . Я пытался использовать многопроцессорную библиотеку для создания процесса для основного кода, но это останавливает работу функции input() для всех пользовательских данных, которые требуются моей программе.

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()

if __name__ == '__main__':
    p = multiprocessing.Process(target = my_code)
    p.start()

    if getch.getch() == '\x1b':
        os.kill(p.pid, signal.SIGINT)

Фактическим результатом будет то, что если в любой точке нажата Esc , если она находится в этом меню, то программа должна выйти. Но когда я запускаю это, я получаю ошибку

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

Есть ли лучший способ реализовать это вместо создания потока multiprocessing?

1 Ответ

2 голосов
/ 17 июня 2019

Использование библиотеки клавиатуры для ожидания клавиш

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()
...