библиотека KEYBOARD заменяет текст с нажатием пробела, как заменять текст без нажатия пробела?
import keyboard as kb
kb.add_abbreviation("@gm", "@gmail.com")
kb.wait()
нужно, чтобы заменял без нажатия пробела после "@gm".
Ответы (1 шт):
Нет, не дураки делали срабатывание аббревиатуры по пробелу. Не дураки.
keyboard
даёт возможность сделать срабатывание по другим клавишам. Но есть особенности.
Если клавиша-триггер остаётся нажатой во время срабатывания, то она не печатается в добавленном тексте. Причина в том что библиотека имитирует нажатия клавиш на клавиатуре, а эта клавиша уже нажата, ваш палец её ещё нажимает. Повторных нажатий не бывает, при наборе она пропускается. Чтобы понять о чём речь запустите программу, нажмите
g
,m
и наm
палец немного задержите. Будет вставлена строкаgail.co
, без буквm
. При коротком нажатии на клавиши будет вставлена целиком строка.
В программе сделана задержка в две десятые секунды до начала срабатывания, чтобы вы успели снять палец с триггера.Вставляемый текст может запустить вставку рекурсивно. В вашем примере так и происходит: аббревиатура совпадает с началом текста, начинается бесконечная рекурсия. В цикл вовлечена клавиатура, ввод, по крайней мере на Linux, повисает намертво.
Программа выключает колбек на одну десятую секунду, чтобы вставляемый текст не привёл к рекурсии.Я в примере заменил
@gm
наgm
. Кажется, библиотека обрабатывает только цифры и буквы в сокращениях. Это можно поправить, но надо будет закопаться в исходники глубже. Оставляю это вам.
import keyboard
import time
def add_my_abbreviation(source_text, replacement_text, match_suffix=False, timeout=2):
trigger = source_text[-1:]
source_text = source_text[:-1]
replacement = '\b' * (len(source_text) + 1) + replacement_text
next_call = 0
def callback():
nonlocal next_call
if time.time() > next_call:
time.sleep(0.2) # time to release trigger key
next_call = time.time() + 0.1 # disable recursive calls
keyboard.write(replacement)
return keyboard.add_word_listener(
source_text,
callback,
triggers=[trigger],
match_suffix=match_suffix,
timeout=timeout
)
add_my_abbreviation('gm', 'gmail.com', match_suffix=True)
keyboard.wait()