библиотека KEYBOARD заменяет текст с нажатием пробела, как заменять текст без нажатия пробела?

import keyboard as kb

kb.add_abbreviation("@gm", "@gmail.com")

kb.wait()

нужно, чтобы заменял без нажатия пробела после "@gm".


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Нет, не дураки делали срабатывание аббревиатуры по пробелу. Не дураки.

keyboard даёт возможность сделать срабатывание по другим клавишам. Но есть особенности.

  1. Если клавиша-триггер остаётся нажатой во время срабатывания, то она не печатается в добавленном тексте. Причина в том что библиотека имитирует нажатия клавиш на клавиатуре, а эта клавиша уже нажата, ваш палец её ещё нажимает. Повторных нажатий не бывает, при наборе она пропускается. Чтобы понять о чём речь запустите программу, нажмите g, m и на m палец немного задержите. Будет вставлена строка gail.co, без букв m. При коротком нажатии на клавиши будет вставлена целиком строка.
    В программе сделана задержка в две десятые секунды до начала срабатывания, чтобы вы успели снять палец с триггера.

  2. Вставляемый текст может запустить вставку рекурсивно. В вашем примере так и происходит: аббревиатура совпадает с началом текста, начинается бесконечная рекурсия. В цикл вовлечена клавиатура, ввод, по крайней мере на Linux, повисает намертво.
    Программа выключает колбек на одну десятую секунду, чтобы вставляемый текст не привёл к рекурсии.

  3. Я в примере заменил @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()
→ Ссылка