Как остановить выполнение функции Python по нажатию кнопки?
Есть функция, которая выполняется какое то произвольное кол-во времени. Мне нужно сделать хоткей, что бы при его использовании, выполнение функции прекращалось.
Я пробовал создать переменную isFuncActive и по нажатию на хоткей менять ее значение на False, а в самой функции в разных частях вставил проверку и в случае False, делал return. Но пока функция активна хоткей не работает.
Выглядит примерно следующим образом. Подскажите пожалуйста, как сделать правильно, что бы по нажатию на хоткей функция прерывалась
isFuncActive = True
keyboard.add_hotkey('Ctrl + 1', func)
keyboard.add_hotkey('Ctrl + 1', stop)
def stop():
isFuncActive = False
def func():
// some code
if isFuncActive == False: return
// some code
if isFuncActive == False: return
// some code
if isFuncActive == False: return
// some code
if isFuncActive == False: return
Ответы (1 шт):
⛔ Вероятно, этот ответ создан с использованием ChatGPT.
? Корректность ответа не проверялась и находится под вопросом.
Проблема здесь в том, что когда вы нажимаете горячую клавишу для остановки функции func(), она все еще может выполняться в фоновом режиме. Именно поэтому ваши проверки, которые вставлены в разных частях функции и отвечают за ее прерывание, не срабатывают.
Решение можно состоит в том, чтобы использовать потоки (threads) для выполнения функции func(). Это позволит нам запустить функцию в отдельном потоке, который можно будет остановить, когда пользователь нажмет горячую клавишу.
Для этого вам нужно сделать следующее:
- Импортируйте модуль threading:
import threading
- Создайте объект-поток из функции
func():
thread = threading.Thread(target=func)
- Запустите поток:
thread.start()
- В функции
stop()измените переменнуюisFuncActiveи остановите поток:
def stop():
global isFuncActive # добавляем global, чтобы изменения были глобальными
isFuncActive = False
thread.join() # останавливаем поток
- В функции
func()добавьте проверку наisFuncActiveвнутри цикла выполнения функции:
def func():
# some code
while isFuncActive:
# some code
# some final code
Теперь при нажатии на горячую клавишу stop() изменит значение isFuncActive на False, что позволит выполнению функции func() завершиться.