Как выделить текст и вставить на место с помощью клавиатуры Python - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь понять поведение, которое я наблюдаю при запуске моего сценария ниже, и как я могу получить желаемый результат. Обычно я использую keyboard.add_word_listener () для запуска функции при вводе строки «test». Он должен выбрать клавишу триггера табуляции плюс текст «test», а затем скопировать его, а затем заменить на bbbb, а затем скопированный текст.

Но если вы посмотрите на гифку, она не выделяет текст. "Bbbb" вставляется слева от текста "test". Но он должен был заменить «тестовый» текст, поскольку он отправляет ctrl + shift + left, которые должны выбрать ранее введенный текст. Странно то, что текст по-прежнему копируется в буфер обмена, даже если он не выглядит выделенным. И это почему-то вставляется в начало отдельной строкой. Я не понимаю, как это возможно. Он работает на macOS, но не Windows.

Я также пробовал заменить ctrl+shift+left,ctrl+shift+left на shift+home, но результат тот же.

enter image description here

Скрипт:

import keyboard 
import time

def test():
    keyboard.send("ctrl+shift+left,ctrl+shift+left")
    time.sleep(1)
    keyboard.send("ctrl+c")
    time.sleep(1)
    keyboard.send("b,b,b,b")
    time.sleep(1)
    keyboard.send("ctrl+v")

keyboard.add_word_listener("test",test,['tab'],False,1)

keyboard.wait()

1 Ответ

0 голосов
/ 18 июня 2020

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

Когда вы вызываете keyboard.send, этот метод анализирует заданный горячие клавиши и пытается отправить scan_code для каждой указанной вами клавиши.

Он анализирует клавиши с помощью метода keyboard.parse_hotkey. Если мы сами вызовем этот метод, мы сможем увидеть, какие коды мы возвращаем:

>>> keyboard.parse_hotkey("ctrl+shift+left")
(((29, 57373), (42, 54), (75,)),)

Здесь мы видим, что оба ctrl и shift имеют два кода, каждый для своих правых / левых аналогов.

Как вы обнаружили, так же как и я, если вы попытаетесь вызвать горячую клавишу, например shift+home, комбинация кнопок кажется работает правильно, потому что ваше положение в документе кажется, меняется. Однако похоже, что способ (по крайней мере, на моей стороне), которым система обрабатывает вызовы на shift, не работает, когда вы вызываете только один из кодов shift.

Мы можем изменить горячую клавишу чтобы включить оба кода, вызывая их по отдельности в горячей клавише:

>>> keyboard.parse_hotkey("ctrl+right shift+left shift+left")
(((29, 57373), (54,), (42,), (75,)),)

Если мы обновим ваш код, включив вместо него указанную выше горячую клавишу, мы увидим, что происходит ожидаемое поведение:

import keyboard
def test():
    keyboard.send("ctrl+right shift+left shift+left")
    keyboard.send("ctrl+c")
    keyboard.send("b,b,b,b")
    keyboard.send("ctrl+v")

keyboard.add_word_listener("test", test, ['tab'], False, 1)
keyboard.wait()

На момент написания я точно не знаю почему приведенный выше код работает, а ваш исходный - нет.

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