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')Проблема в том, что при запуске такого кода в фоне клавиатура начинает сильно тормозить (видимо из-за огромного количества проверок в цикле). Если кто-то подскажет, как оптимизировать такой код, это тоже будет отличным решением проблемы.
Чтобы клавиатура не тормозила нужно использовать следующий код:
from pynput import keyboarddef on_press(key): try: # Проверяем клавиши здесь except AttributeError: # Выводим сообщение об ошибке, если нужноwith keyboard.Listener(on_press=on_press) as listener: listener.join()В данном случае вы всегда ожидаете нажатие клавиши не в основном потоке. Да, я знаю как организованы потоки в python и не буду сильно углубляться в эту тему, а просто дам код решения.
Войдите чтобы оставить ответ