Как остановить выполнение функции Python по нажатию кнопки?

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

Есть функция, которая выполняется какое то произвольное кол-во времени. Мне нужно сделать хоткей, что бы при его использовании, выполнение функции прекращалось.

Я пробовал создать переменную 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

Ответы

▲ 0Принят

Проблема здесь в том, что когда вы нажимаете горячую клавишу для остановки функции func(), она все еще может выполняться в фоновом режиме. Именно поэтому ваши проверки, которые вставлены в разных частях функции и отвечают за ее прерывание, не срабатывают.

Решение можно состоит в том, чтобы использовать потоки (threads) для выполнения функции func(). Это позволит нам запустить функцию в отдельном потоке, который можно будет остановить, когда пользователь нажмет горячую клавишу.

Для этого вам нужно сделать следующее:

  1. Импортируйте модуль threading:
import threading
  1. Создайте объект-поток из функции func():
thread = threading.Thread(target=func)
  1. Запустите поток:
thread.start()
  1. В функции stop() измените переменную isFuncActive и остановите поток:
def stop():
  global isFuncActive # добавляем global, чтобы изменения были глобальными
  isFuncActive = False
  thread.join() # останавливаем поток
  1. В функции func() добавьте проверку на isFuncActive внутри цикла выполнения функции:
def func():
  # some code
  while isFuncActive:
    # some code
  # some final code

Теперь при нажатии на горячую клавишу stop() изменит значение isFuncActive на False, что позволит выполнению функции func() завершиться.