Как кодировать потоковый обработчик событий клавиатуры в Python? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь сделать 'kill switch' для моего python сценария. По сути, пока мой основной сценарий зацикливается и выполняет свои функции, в фоновом режиме он прослушивает определенное нажатие клавиши c, а затем полностью выходит из сценария при нажатии этой клавиши.

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

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

Я использую pynput на всякий случай, если это может привести к несовместимости с библиотеками потоков.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 15 апреля 2020

keyboard модуль захватывает события в отдельном потоке, поэтому это может быть то, что вы ищете.

Попробуйте что-то вроде этого:

import keyboard
import time

stop_switch = False


def switch(keyboard_event_info):
    global stop_switch

    stop_switch = True

    keyboard.unhook_all()
    print(keyboard_event_info)


def main_function():
    global stop_switch

    keyboard.on_press_key('enter', switch)

    while stop_switch is False:
        if stop_switch is False:
            print("1")
        if stop_switch is False:
            time.sleep(0.2)
        if stop_switch is False:
            print("2")
        if stop_switch is False:
            time.sleep(0.5)
        if stop_switch is False:
            print("3")
        if stop_switch is False:
            time.sleep(1)

    stop_switch = False


main_function()

Простой способ выйти почти сразу из time.sleep (), например, с 10 секундами сна:

def main_function():
    global stop_switch

    keyboard.on_press_key('enter', switch)

    while stop_switch is False:
        if stop_switch is False:
            print("sleeping for 10 seconds")
            for i in range(100):
                if stop_switch is False:
                    time.sleep(0.1)
        print("program stopped")

    stop_switch = False

Но лучше использовать threading.Event. Проверьте это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...