Прервать выполнение кода нажатием на клавишу ESC

Рейтинг: 0Ответов: 1Опубликовано: 23.03.2023

Имеется скрипт, который необходимо прервать нажатием на клавишу ESC. Вариант №1 - не сработал:

import keyboard
import time
import threading
import sys

flag = False #переменная, значение которой будем проверять из потоков

def escaping_from_script(): #функция, которая поменяет значение переменной flag
    global flag
    while True:
        if keyboard.is_pressed('esc'):
            flag = True
            break

def foo():
#здесь много-много инструкций, исполнение которых надо прервать нажатием на ESC
    pass

th1 = threading.Thread(target=escaping_from_script, daemon=True) #поток меняет переменную flag
th1.start()

th2 = threading.Thread(target=foo, daemon=True) #поток исполняет скрипт
th2.start()

while flag == False: #основной поток, вырубает программу, если флаг тру
    continue
sys.exit(0)

Вариант № 2, тоже не то, пока все инструкции из foo() не доделает, программу не завершит:

import keyboard
import time
import threading

flag = False #переменная, значение которой будем проверять из потоков

def escaping_from_script(): #функция, которая поменяет значение переменной flag
    global flag
    while True:
        if keyboard.is_pressed('esc'):
            flag = True
            break

def foo():
#здесь много-много инструкций, исполнение которых надо прервать нажатием на ESC
    pass

th = threading.Thread(target=escaping_from_script, daemon=True)
th.start()

while flag == False:
    foo()

Что делаю не так?

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

Ответы

▲ 1

Как выяснилось, здесь надо завести горячую клавишу и все заработает. Итоговый код:

import sys
import threading
import time
import keyboard

flag = False

def escape_from():
    global flag
    flag = True

def foo():
# много-много инструкций

keyboard.add_hotkey('esc', escape_from) #поменяет переменную flag

th = threading.Thread(target=foo, daemon=True) #запускаем поток с инструкциями
th.start()

while flag == False:
    continue
print('finished right!')
sys.exit(9)