Прервать выполнение кода нажатием на клавишу ESC
Имеется скрипт, который необходимо прервать нажатием на клавишу 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()
Что делаю не так?
В дальнейшем планируется всю программу повесить на горячие клавиши и вызывать по мере надобности. Инструкций там очень много, и если случайно нажать на горячие клавиши, то придется ждать, пока все не закончится.
Источник: Stack Overflow на русском