Как установить keyboard python
Перейти к содержимому

Как установить keyboard python

  • автор:

Как научить Python использовать клавиатуру и мышь. Часть 1

В любой работе рано или поздно наступает момент, когда на компьютере нужно выполнять монотонные задачи, повторяя одни и те же действия из раза в раз. Кажется, что это можно было бы легко автоматизировать, ведь алгоритм прост и понятен, но на практике оказывается, что подходящий инструмент для такой автоматизации найти трудно. Но это не значит, что такой инструмент нельзя создать.

Цель: написать программу на языке Python для создания простых макросов, сначала записывающих, а после воспроизводящих действия клавиатуры и мыши. Управление программой будет происходить через графический интерфейс.

В начале потребуется библиотека для записи действий мыши и клавиатуры. В качестве таковой возьмём pynput.

Для отслеживания действий клавиатуры нужно инициализировать класс Listener. В качестве аргументов он принимает две функции: первая активируется, когда пользователь нажимает клавишу, а вторая – когда отпускает. Задействованные клавиши передаются этим функциям в аргументе. Далее нужно запустить саму прослушку клавиатуры. Всё это выглядит следующем образом:

from pynput import keyboard # Действие, когда пользователь нажимает клавишу на клавиатуре def on_press(key): print(f'Была нажата клавиша ') # Действие, когда пользователь отпускает клавишу на клавиатуре def on_release(key): print(f'Была отпущена клавиша ') # Инициализация прослушки клавиатуры keyboard_listener = keyboard.Listener( on_press=on_press, on_release=on_release ) # Старт прослушки клавиатуры keyboard_listener.start() # Здесь может выполняться другой код # Остановка прослушки клавиатуры keyboard_listener.stop() 

Для прослушки мыши нужно выполнить похожие действия, отличие лишь в том, что Listener для мыши принимает три функции: для перемещения курсора, для нажатия клавиши мыши и для пролистывания. Единица координат курсора – пиксель, отсчет системы координат ведётся от левого верхнего угла монитора.

from pynput import mouse # Действие при движении курсора def on_move(x, y): print(f'Курсор переместился на позицию ' f' по горизонтали и по вертикали') # Действие при нажатии кнопки мыши def on_click(x, y, button, is_pressed): print(f'Была ' f'клавиша на позиции ' f' по горизонтали и по вертикали') # Действие при прокручивании def on_scroll(x, y, dx, dy): horizontal_scroll = '' if dx < 0: horizontal_scroll = 'влево' elif dx >0: horizontal_scroll = 'вправо' vertical_scroll = '' if dy < 0: vertical_scroll = 'вниз' elif dy >0: vertical_scroll = 'вверх' print(f'Была прокрутка ' f'  на позиции ' f' по горизонтали и по вертикали') # Прослушка мыши mouse_listener = mouse.Listener( on_move=on_move, on_click=on_click, on_scroll=on_scroll ) # Старт прослушки мыши mouse_listener.start() # Здесь может выполняться другой код # Остановка прослушки мыши mouse_listener.stop() 

Чтобы иметь возможность воспроизвести действия пользователя, прослушку клавиатуры и мыши нужно куда-то сохранить. Удобнее всего каждое действие записывать в словарь, где указывать устройство и что нажал пользователь. Все эти словари помещаем в список, который соответствует последовательности ввода.

Исходя из этого, получается следующая функция:

# Последовательность действий клавиатуры и мыши track = [] # Добавление новых действий клавиатуры и мыши # device - название контроллера ('keyboard', 'mouse') # action - действие ('press', 'release', 'move', 'scroll') # kwargs - все остальные параметры def add_action(device, action, **kwargs): if action not in ['press', 'release', 'move', 'scroll']: raise ValueError('Wrong action name.') if device == 'keyboard': # Если был ввод с клавиатуры, то просто перечисляем параметры track.append(< 'device': device, 'action': action, 'key': kwargs['key'] >) elif device == 'mouse': # Если был ввод с мыши, то сначала указываем положение курсора action_dict = < 'device': device, 'action': action, 'x': kwargs['x'], 'y': kwargs['y'] ># а после добавляем дополнительные параметры # в зависимости от действия if action == 'press' or action == 'release': action_dict['key'] = kwargs['key'] if action == 'scroll': action_dict['dx'] = kwargs['dx'] action_dict['dy'] = kwargs['dy'] self.track.append(action_dict) 

А чтобы имитировать действия клавиатуры или мыши нужно использовать класс Controller из той же библиотеки pynput. Если исходить из того способа записи прослушки, что описан чуть выше, то функция для имитации будет иметь следующий вид:

from pynput import keyboard, mouse def run(): keyboard_controller = keyboard.Controller() mouse_controller = mouse.Controller() for t in self.track: time.sleep(0.1) # Действия клавиатуры if t['device'] == 'keyboard': # Нажатие клавиши клавиатуры if t['action'] == 'press': keyboard_controller.press(t['key']) # Отпуск клавиши клавиатуры elif t['action'] == 'release': keyboard_controller.release(t['key']) # Действия мыши if t['device'] == 'mouse': # Движение мыши mouse_controller.move( t['x'] - mouse_controller.position[0], t['y'] - mouse_controller.position[1] ) # Прокручивание колёсика if t['action'] == 'scroll': mouse_controller.scroll(t['dx'], t['dy']) # Нажатие кнопки мыши elif t['action'] == 'press': mouse_controller.press(t['key']) # Отпуск кнопки мыши elif t['action'] == 'release': mouse_controller.release(t['key']) 

Чтобы не переполнять текст вставками кода, полная версия с использованием библиотеки pynput для прослушки и имитации клавиатуры или мыши расположена в репозитории github, ссылка на который находится в конце поста.

Единственное, что стоит отметить – это остановка прослушки при нажатии на правый shift. Клавишу можно выбрать любую, но так как правый shift используется реже, то удобнее использовать его. В коде это выглядит так:

def on_press(key): if key == keyboard.Key.shift_r: keyboard_listener.stop() mouse_listener.stop() return . 

Теперь, для удобства восприятия, будет создан простой интерфейс с использованием библиотеки PySimpleGUI. В этом интерфейсе будут отображаться записанные действия пользователя, а также кнопки для старта записи или запуска имитации. Чтобы создать окно, с которым можно взаимодействовать, нужно инициализировать класс Window, передав в него двумерный список layout, представляющий собой взаимное расположение элементов:

import PySimpleGUI as psg # Элементы интерфейса layout = [ # Клавиши для изменения последовательности записанных действий [psg.Button('Up'), psg.Button('Down')], # Дерево для отображения самих записанных действий [psg.Tree(data=psg.TreeData(), key='Keys tree', headings=[])], # Кнопки для управления записью [psg.Button('Run'), psg.Button('Record')] ] # Создание окна wnd = psg.Window('Holop', layout, size=(500, 500)) 

Перехват нажатий осуществляется в бесконечном цикле, выйти из которого можно только тогда, когда пользователь закроет окно интерфейса:

while True: # Ожидание события окна event, values = wnd.read() # Выбор действия в зависимости от нажатой кнопки if event == psg.WINDOW_CLOSED: # Выход break elif event == 'Up': # Поднять выбранные элементы replace_elem(wnd.Element('Keys tree'), 'up') elif event == 'Down': # Опустить выбранные элементы replace_elem(wnd.Element('Keys tree'), 'down') elif event == 'Run': # Запустить имитацию действий клавиатуры и мыши run() elif event == 'Record': # Запустить прослушку клавиатуры и мыши start_record() wnd.close() 

Как производится запись и имитация действий клавиатуры и мыши рассказано выше, а вот для перемещения элементов используется следующий код:

# Поднимает или опускает выбранные элементы def replace_elem(tree, direction): # Список выбранных элементов select_elems = tree.Widget.selection() # Если ни один элемент не выбран, то выход if len(select_elems) == 0: return # Получение основных элементов дерева treedata = tree.TreeData tree_root = treedata.tree_dict[''] # Перемещение всех выбранных элементов for s_e in select_elems: # Получение отмеченного элемента elem = treedata.tree_dict[tree.IdToKey[s_e]] ind = tree_root.children.index(elem) # Перемещение этого элемента if direction == 'up' and ind >= 0: tree_root.children[ind-1], tree_root.children[ind] =\ tree_root.children[ind], tree_root.children[ind-1] track[ind-1], track[ind] = track[ind], track[ind-1] elif direction == 'down' and ind < len(tree_root.children): tree_root.children[ind], tree_root.children[ind+1] =\ tree_root.children[ind+1], tree_root.children[ind] track[ind], track[ind+1] = track[ind+1], track[ind] # Обновление дерева tree.update(values=treedata) 

После запуска кода перед нами появляется окно, с которым можно взаимодействовать:

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

Здесь были разобраны основные компоненты программы, её полная версия с дополнительным функционалом размещена по ссылке ниже. Воспользоваться ей можно, например, при заполнении множества типовых форм, копируя данные из файла excel, или при установке программ на разных компьютерах через их графический интерфейс, когда скриптом это сделать нельзя.

keyboard

Take full control of your keyboard with this small Python library. Hook global events, register hotkeys, simulate key presses and much more.

Features

  • Global event hook on all keyboards (captures keys regardless of focus).
  • Listen and send keyboard events.
  • Works with Windows and Linux (requires sudo), with experimental OS X support (thanks @glitchassassin!).
  • Pure Python, no C modules to be compiled.
  • Zero dependencies. Trivial to install and deploy, just copy the files.
  • Python 2 and 3.
  • Complex hotkey support (e.g. ctrl+shift+m, ctrl+space ) with controllable timeout.
  • Includes high level API (e.g. record and play, add_abbreviation).
  • Maps keys as they actually are in your layout, with full internationalization support (e.g. Ctrl+ç ).
  • Events automatically captured in separate thread, doesn't block main program.
  • Tested and documented.
  • Doesn't break accented dead keys (I'm looking at you, pyHook).
  • Mouse support available via project mouse ( pip install mouse ).

Usage

pip install keyboard 

or clone the repository (no installation required, source files are sufficient):

git clone https://github.com/boppreh/keyboard 

or download and extract the zip into your project folder.

Then check the API docs below to see what features are available.

Example

  • Events generated under Windows don't report device id ( event.device == None ). #21
  • Media keys on Linux may appear nameless (scan-code only) or not at all. #20
  • Key suppression/blocking only available on Windows. #22
  • To avoid depending on X, the Linux parts reads raw device files ( /dev/input/input* ) but this requires root.
  • Other applications, such as some games, may register hooks that swallow all key events. In this case keyboard will be unable to report events.
  • This program makes no attempt to hide itself, so don't use it for keyloggers or online gaming bots. Be responsible.

Модуль pynput в Python, управление клавиатурой и мышью

Перехват и имитация событий клавиатуры и мыши из Python

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

  • pynput.keyboard - содержит классы для управления и мониторинга клавиатуры.
  • pynput.mouse - содержит классы для управления и мониторинга мыши или trackpad .

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

from pynput import mouse, keyboard 

Установка модуля pynput в виртуальное окружение.

Модуль pynput размещен на PyPI, поэтому установка относительно проста.

# создаем виртуальное окружение, если нет $ python3 -m venv .venv --prompt VirtualEnv # активируем виртуальное окружение $ source .venv/bin/activate # ставим модуль pynput (VirtualEnv):~$ python3 -m pip install -U pynput

Модуль pynput будет пытаться использовать определенный внутренний интерфейс, подходящий для текущей платформы, но этот автоматический выбор можно переопределить.

Если заданы переменные окружения $PYNPUT_BACKEND_KEYBOARD или $PYNPUT_BACKEND , то их значение будет использоваться в качестве имени сервера для классов клавиатуры, а если заданы $PYNPUT_BACKEND_MOUSE или $PYNPUT_BACKEND , то их значение будет использоваться в качестве имени сервера для классов мыши.

Доступные серверные части являются:

  • darwin - значение по умолчанию для macOS.
  • win32 - значение по умолчанию для Windows.
  • xorg - значение по умолчанию для других операционных систем.
  • uinput - дополнительный серверный интерфейс для Linux, требующий привилегий root и поддерживающий только клавиатуры.
  • dummy - нефункциональный, но импортируемый серверный интерфейс. Он полезен в качестве серверной части мыши при использовании серверной части uinput .

Ограничения платформ.

Модуль pynput направлен на предоставление единого API для всех поддерживаемых платформ, но в некоторых случаях это не совсем возможно.

Ограничения платформы Linux.

В Linux, модуль pynput использует X -сервер или библиотеку uinput (требует root привилегий). При работе под X -сервером должно выполняться следующее:

  • X-сервер должен быть запущен.
  • Должна быть установлена ​​переменная окружения $DISPLAY .
  • При работе под uinput должно быть верно следующее: Необходимо запускать программу Python с root правами, чтобы она имела необходимые разрешения для работы с uinput . Первое требование для X -сервера означает, что запуск pynput через SSH обычно не работает. Чтобы обойти это, обязательно установите переменную окружения $DISPLAY :

$ DISPLAY=:0 python -c 'import pynput' 

При работе под Wayland эмулятор X-сервера Xwayland обычно работает, предоставляя ограниченную функциональность. При этом, модуль pynput будет получать входные события только от приложений, работающих под управлением этого эмулятора.

Ограничения платформы macOS.

Последние версии macOS ограничивают мониторинг клавиатуры из соображений безопасности. По этой причине одно из следующего должно быть истинным:

  • Процесс должен запускаться от имени root .
  • Приложение должно быть внесено в белый список в разделе "Разрешить доступ для вспомогательных устройств". Обратите внимание, что для этого может потребоваться упаковка приложения, т.к. в противном случае, вся установка Python должна быть включена в белый список.
  • В версиях после Mojave , если скрипт запускается из терминала, то может потребоваться добавить в белый список также приложение терминала.

Обратите внимание, что это требование не относится к мониторингу мыши или trackpad .

Если нет недостающих разрешений, то все классы слушателей Listener имеют дополнительный атрибут IS_TRUSTED , который имеет значение True .

Ограничения платформы Windows.

В Windows, виртуальные события, отправленные другими процессами, могут не приниматься. Чтобы отправлять любые сгенерированные виртуальные события всем запущенным слушателям текущего процесса, модуль pynput принимает меры предосторожности.

Кроме того, отправка событий нажатия клавиш будет правильно распространяться на остальную часть системы, но сама операционная система не будет считать, что кнопки действительно нажаты. Это означает, что события нажатия клавиши, созданные модулем, не будут генерироваться постоянно, как при физическом удерживании клавиши, а определенные последовательности клавиш, такие как нажатие Shift при нажатии клавиш со стрелками, не будут работать должным образом.

Пример использования модуля pynput .

Мониторинг клавиатуры.

Подмодуль pynput.keyboard содержит классы для управления и мониторинга клавиатуры.

from pynput import keyboard # В этом блоке будет работать слушатель событий. with keyboard.Events() as events: for event in events: if event.key == keyboard.Key.esc: break else: print(f'Получено событие клавиатуры event>') 

Управление мышью.

Подмодуль pynput.mouse содержит классы для управления и мониторинга мыши.

from pynput.mouse import Button, Controller mouse = Controller() # Считывание положения указателя print(f'Текущее положение указателя: mouse.position>') # Установка положения указателя mouse.position = (10, 20) print(f'Указатель перемещен в позицию: mouse.position>') # Перемещение указателя относительно текущего положения mouse.move(5, -5) # Нажатие и отпускание левой кнопки мыши mouse.press(Button.left) mouse.release(Button.left) # Двойной клик - отличается от простого нажатия mouse.click(Button.left, 2) # Прокрутка страницы на два шага вниз mouse.scroll(0, 2) 
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Мониторинг и управление клавиатурой
  • Мониторинг за состоянием и управление мышью
  • Класс keyboard.Controller() модуля pynput
  • Класс keyboard.Listener() модуля pynput
  • Класс keyboard.Key модуля pynput
  • Класс keyboard.KeyCode() модуля pynput
  • Класс mouse.Controller() модуля pynput
  • Класс mouse.Listener() модуля pynput

Установил модуль "keyboard", а python его не видит [закрыт]

Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 3 года назад .
Я установил модуль "keyboard", а Python его не видит. Импортировал модуль я так:

from keyboard import is_pressed, write, send 

Но как бы я не старался переустанавливать модуль стандартный IDLE его не видит, как это можно исправить? Проблема скорее всего появилась когда я устанавливал новую версию Python Мои попытки установки и переустановки: Стандартный IDLE Удаление модуля и последующая его переустановка. Дополнение: Только-что попробовал запустить Python файл через cmd и каким-то чудом он не стал жаловаться на отсутствие библиотеки и просто заработал. Всё-таки я хочу разобраться почему так происходит. Помогите пожалуйста!

Отслеживать
11.9k 2 2 золотых знака 11 11 серебряных знаков 28 28 бронзовых знаков
задан 13 янв 2021 в 1:35
49 5 5 бронзовых знаков

У Вас стоит две разных версии python? Попробуйте просто запустить python из cmd (просто интерпретатор, не передавая ему файл скрипта), какую версию напишет?

13 янв 2021 в 2:15

Посмотрите данный вопрос. Возможно pip установил пакет на python2 . Как написано в предыдущем комментарии. проверьте вашу версию python . Пропробуйте pip3 install keyboard для установки на python3

13 янв 2021 в 5:50

@V-Mor Версия Python у меня Python 3.9.1 (i.imgur.com/kiBbUsn.png) @Sherlock У меня никогда небыл установлен любой Python 2.x, установка 100% была сделана на Python 3.9.1, так же я уже пробовал ранее устанавливать библиотеку при помощи команды pip3

14 янв 2021 в 20:50
Возможно, глупый вопрос, но Вы перезапускали IDLE после установки модуля? А то мало ли.
15 янв 2021 в 1:25

@V-Mor Да, я перезагружал IDLE, действительно странный вопрос) Я так-же неоднократно перезагружал полностью систему.

15 янв 2021 в 10:46

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

1 вариант решения: Чтобы Python увидел библиотеку запускать скрипт нужно через командную строку (cmd). Не знаю как так происходило, но оно так работало.

2 вариант решения: Так-же работает вариант переустановить систему и последующая установка чистейшего Python на новую систему, тогда внутри системы Python перестанет конфликтовать сам с собой или с системой. Незнаю как так получилось, но это скорее всего конфликт Python с чем-то что мне не ведомо)

Мне помогло лишь переустановить полностью систему, тем самым конфликты системы с Python видимо исчезли и он стал нормально воспринимать установленную мной библиотеку "keyboard" [Ранее я уже пробовал переустанавливать Python или откатываться назад на предыдущие версии (может там что-то бы заработало), но нечего не помогало, лишь переустановка системы (Что достаточно радикально!), помогло мне справиться с проблемой.]

Это одиночная ошибка которую я допустил я сам и из-за этого скорее всего подобных случаев не будет происходить с другими людьми, было неправильно задавать такой вопрос здесь)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *