Avatar ·

Python: как заблокировать клавиши для всего, кроме модуля keyboard?

📁 python, вопрос, боты, ии

У меня есть программа, которая должна подставлять определённые символы и комбинации символов при нажатии определённых клавиш:

import keyboardwhile True:    hotkey = keyboard.read_hotkey(suppress=False)    if hotkey == 'j+k':        keyboard.write('j + k')

(Я не использую keyboard.add_hotkey(), потому что в дальнейшем в моих планах не конкретные горячие клавиши, а проверка на наличие определённых клавиш в hotkey. Но это не меняет ситуацию: add_hotkey() ведёт себя так же) Я ожидаю, что при запуске этой программы, когда я буду одновременно нажимать j+k, скажем, в текстовом редакторе, будет печататься 'j + k'. Но я получаю 'jkj + k'. То есть сами клавиши j и k передаются текстовому редактору до срабатывания функции. Если я сделаю:

keyboard.block_key('j')keyboard.block_key('k')

, эти клавиши не будут обрабатываться и read_hotkey.

Вопрос: возможно ли сделать так, чтобы определённые клавиши были заблокированы для всего, кроме listener-а в keyboard? То есть чтобы в момент работы программы эти клавиши не могли выполнять других функций?

UPD: Я обнаружил, что при заблокированных клавишах всё ещё срабатывает keyboard.is_pressed(), и у меня родился вот такой код:

import keyboardkeyboard.block_key('j')keyboard.block_key('k')while True:    if keyboard.is_pressed('j+k'):        keyboard.write('j + k')

Проблема в том, что при запуске такого кода в фоне клавиатура начинает сильно тормозить (видимо из-за огромного количества проверок в цикле). Если кто-то подскажет, как оптимизировать такой код, это тоже будет отличным решением проблемы.

Avatar ·

Чтобы клавиатура не тормозила нужно использовать следующий код:

from pynput import keyboarddef on_press(key):    try:        # Проверяем клавиши здесь    except AttributeError:        # Выводим сообщение об ошибке, если нужноwith keyboard.Listener(on_press=on_press) as listener:    listener.join()

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

Войдите чтобы оставить ответ

Блоги