From dac472da8a802eab4329630ad12c0c68702e1dfa Mon Sep 17 00:00:00 2001 From: Mikhail <-> Date: Thu, 18 Aug 2022 16:26:10 +0300 Subject: [PATCH] Robot.Keyboard.Write is ready for Linux --- Sources/GuideSphinx/01_HowToInstall.rst | 2 +- Sources/GuideSphinx/Robot/04_keyboard.rst | 16 + Sources/pyOpenRPA/Robot/Keyboard.py | 129 +++++++- Utils/Jupyter-notebooks/Keyboard.ipynb | 370 ++++++++-------------- 4 files changed, 269 insertions(+), 248 deletions(-) diff --git a/Sources/GuideSphinx/01_HowToInstall.rst b/Sources/GuideSphinx/01_HowToInstall.rst index 25890c13..752a4e3c 100644 --- a/Sources/GuideSphinx/01_HowToInstall.rst +++ b/Sources/GuideSphinx/01_HowToInstall.rst @@ -22,7 +22,7 @@ ************************************************** sudo apt-get scrot (компонент для извлечения скриншотов. pyOpenRPA.Robot.Screen) sudo apt-get install xclip (компонент для работы с буфером обмена. pyOpenRPA.Robot.Clipboard) - +setxkbmap: apt-get install x11-xkb-utils (компонент для взаимодействия с клавиатурой, https://command-not-found.com/setxkbmap) ************************************************** Проверить, что pyOpenRPA развернута корректно? diff --git a/Sources/GuideSphinx/Robot/04_keyboard.rst b/Sources/GuideSphinx/Robot/04_keyboard.rst index 2c754580..4681f68e 100644 --- a/Sources/GuideSphinx/Robot/04_keyboard.rst +++ b/Sources/GuideSphinx/Robot/04_keyboard.rst @@ -14,6 +14,22 @@ ВНИМАНИЕ! ПРИ ВЫЗОВЕ ФУНКЦИЙ ОБРАЩАЙТЕ ВНИМАНИЕ НА РЕГИСТР. +************************ +Доп. настройки в LINUX +************************ +Используется компонент setxkbmap: apt-get install x11-xkb-utils (компонент для взаимодействия с клавиатурой, https://command-not-found.com/setxkbmap) + +Особенности ОС Linux позволяют выполнять ввод разноязычного текста только через переключение раскладок клавиатуры в режиме реального времени +По умолчанию установлены следующие раскладки для Русского и английского языков: +Keyboard.KEY_RUS_LAYOUT = "ru" # NEED FOR LINUX (FOR LAYOUT SWITCH) +Keyboard.KEY_ENG_LAYOUT = "us" # NEED FOR LINUX (FOR LAYOUT SWITCH) + +Проверить, что данные раскладки работают корректно, можно с помощью следующей команды в терминале: +setxkbmap -layout us,ru -option grp:alt_shift_toggle +После ввода попробуйте ввести английские символы, после чего переключиться на другой язык с помощью комбинации клавиш Alt+Shift + +Если у вас используются другие layout, то вы можете указать их в переменных Keyboard.KEY_RUS_LAYOUT и Keyboard.KEY_ENG_LAYOUT для русского и английского языков соответственно. + ************************************************** Примеры использования ************************************************** diff --git a/Sources/pyOpenRPA/Robot/Keyboard.py b/Sources/pyOpenRPA/Robot/Keyboard.py index d44b7f1d..a0a9e68d 100644 --- a/Sources/pyOpenRPA/Robot/Keyboard.py +++ b/Sources/pyOpenRPA/Robot/Keyboard.py @@ -1,4 +1,6 @@ -from keyboard import * +from pyOpenRPA.Tools import CrossOS +if CrossOS.IS_WINDOWS_BOOL: from keyboard import * +elif CrossOS.IS_LINUX_BOOL: import pyautogui, sys, os import time # Настройки модуля Keyboard @@ -7,6 +9,7 @@ WAIT_AFTER_SEC_FLOAT = 0.4 # Время, которое ожидать посл # ШЕСТНАДЦАТИРИЧНЫЙ СКАН-КОД В РУССКОЙ РАСКЛАДКЕ (НЕЗАВИСИМО ОТ ВЫБРАННОГО ЯЗЫКА НА КЛАВИАТУРЕ) # ОТОБРАЖЕНИЕ СКАН КОДОВ НА КЛАВИАТУРЕ https://snipp.ru/handbk/scan-codes +KEY_RUS_LAYOUT = "ru" # NEED FOR LINUX (FOR LAYOUT SWITCH) KEY_RUS_Ф = 0x1E #A KEY_RUS_И = 0x30 #B KEY_RUS_С = 0x2E #C @@ -40,7 +43,8 @@ KEY_RUS_Ю = 0x34 #> KEY_RUS_Х = 0x1A #[ KEY_RUS_Ъ = 0x1B #] KEY_RUS_Э = 0x28 #' - + +KEY_ENG_LAYOUT = "us" # NEED FOR LINUX (FOR LAYOUT SWITCH) KEY_ENG_A = 0x1E #A KEY_ENG_B = 0x30 #B KEY_ENG_C = 0x2E #C @@ -68,6 +72,45 @@ KEY_ENG_X = 0x2D #X KEY_ENG_Y = 0x15 #Y KEY_ENG_Z = 0x2C #Z +KEY_ENG_TILDE = 0x29 #~ +KEY_ENG_COLON = 0x27 #: +KEY_ENG_PLUS = 0x0D #+ +KEY_ENG_MINUS = 0x0C #- +KEY_ENG_LESS_THAN = 0x33 #< , +KEY_ENG_GREATER_THAN = 0x34 #> . +KEY_ENG_SOLIDUS = 0x35 #/ ? +KEY_ENG_SQUARE_BRACKET_LEFT = 0x1A #[ +KEY_ENG_SQUARE_BRACKET_RIGHT = 0x1B #] +KEY_ENG_APOSTROPHE = 0x28 #' " +KEY_ENG_VERTICAL_LINE = 0x2B #| \ + +KEY_ENG_NUMPAD_0 = 0x52 +KEY_ENG_NUMPAD_1 = 0x4F +KEY_ENG_NUMPAD_2 = 0x50 +KEY_ENG_NUMPAD_3 = 0x51 +KEY_ENG_NUMPAD_4 = 0x4B +KEY_ENG_NUMPAD_5 = 0x4C +KEY_ENG_NUMPAD_6 = 0x4D +KEY_ENG_NUMPAD_7 = 0x47 +KEY_ENG_NUMPAD_8 = 0x48 +KEY_ENG_NUMPAD_9 = 0x49 +KEY_ENG_NUMPAD_ASTERISK = 0x37 #* +KEY_ENG_NUMPAD_PLUS = 0x4E +KEY_ENG_NUMPAD_MINUS = 0x4A +KEY_ENG_NUMPAD_DELETE = 0x53 +KEY_ENG_NUMPAD_SOLIDUS = 0x35 #/ +KEY_ENG_NUMPAD_ENTER = 0x11c + +KEY_ENG_0 = 0xB +KEY_ENG_1 = 0x2 +KEY_ENG_2 = 0x3 +KEY_ENG_3 = 0x4 +KEY_ENG_4 = 0x5 +KEY_ENG_5 = 0x6 +KEY_ENG_6 = 0x7 +KEY_ENG_7 = 0x8 +KEY_ENG_8 = 0x9 +KEY_ENG_9 = 0xA KEY_HOT_NUMPAD_0 = 0x52 KEY_HOT_NUMPAD_1 = 0x4F @@ -164,13 +207,50 @@ KEY_HOT_7 = 0x8 KEY_HOT_8 = 0x9 KEY_HOT_9 = 0xA +MAP_RUS_ENG = { # FOR LINUX PURPOSE +"Ё":"`", +"Й":"q", +"Ц":"w", +"У":"e", +"К":"r", +"Е":"t", +"Н":"y", +"Г":"u", +"Ш":"i", +"Щ":"o", +"З":"p", +"Х":"[", +"Ъ":"]", +"Ф":"a", +"Ы":"s", +"В":"d", +"А":"f", +"П":"g", +"Р":"h", +"О":"j", +"Л":"k", +"Д":"l", +"Ж":";", +"Э":"'", +"Я":"z", +"Ч":"x", +"С":"c", +"М":"v", +"И":"b", +"Т":"n", +"Ь":"m", +"Б":",", +"Ю":"." +} + def Write(inTextStr:str, inDelayFloat:float=0, inRestoreStateAfterBool:bool=True, inExactBool:bool=None, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): - """ - Печатает текст, который был передан в переменной inTextStr (поддерживает передачу в одной строке символов разного языка). Не зависит от текущей раскладки клавиатуры! Посылает искусственные клавишные события в ОС, моделируя печать данного текста. Знаки, не доступные на клавиатуре, напечатаны как явный unicode знаки, использующие определенную для ОС функциональность, такие как alt+codepoint. + """L+,W+: Печатает текст, который был передан в переменной inTextStr (поддерживает передачу в одной строке символов разного языка). Не зависит от текущей раскладки клавиатуры! Посылает искусственные клавишные события в ОС, моделируя печать данного текста. Знаки, не доступные на клавиатуре, напечатаны как явный unicode знаки, использующие определенную для ОС функциональность, такие как alt+codepoint. Чтобы гарантировать текстовую целостность, все в настоящее время нажатые ключи выпущены прежде текст напечатан, и модификаторы восстановлены впоследствии. ВНИМАНИЕ! ПЕЧАТАЕТ ЛЮБУЮ СТРОКУ, ДАЖЕ В СОЧЕТАНИИ НЕСКОЛЬКИХ ЯЗЫКОВ ОДНОВРЕМЕННО. ДЛЯ РАБОТЫ С ГОРЯЧИМИ КЛАВИШАМИ ИСПОЛЬЗУЙ ФУНКЦИЮ Send, Up, Down, HotkeyCombination + ВНИМАНИЕ! В LINUX НЕ ДЕЙСТВУЮТ СЛЕДУЮЩИЕ ПАРАМЕТРЫ: inRestoreStateAfterBool, inExactBool + .. code-block:: python # Keyboard: Взаимодействие с клавиатурой @@ -188,9 +268,46 @@ def Write(inTextStr:str, inDelayFloat:float=0, inRestoreStateAfterBool:bool=True :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ - write(text=inTextStr, delay=inDelayFloat, restore_state_after=inRestoreStateAfterBool, exact=inExactBool) + if CrossOS.IS_WINDOWS_BOOL: + write(text=inTextStr, delay=inDelayFloat, restore_state_after=inRestoreStateAfterBool, exact=inExactBool) + elif CrossOS.IS_LINUX_BOOL: + _WriteLinux(inTextStr=inTextStr, inDelayFloat=inDelayFloat) time.sleep(inWaitAfterSecFloat) +def _WriteLinux(inTextStr, inDelayFloat=0.01): + lModuleKeyboard = sys.modules[__name__] + lVarList = dir(lModuleKeyboard) + lLayoutStr = None + for lCharStr in inTextStr: + # Check rus (ru) + lVarNameStr = f"KEY_RUS_{lCharStr.upper()}" + lFoundBool = False + lShiftBool = False + if lVarNameStr in lVarList: + lNewLayoutStr=getattr(lModuleKeyboard, "KEY_RUS_LAYOUT") + lCapBool = lCharStr.isupper() + lCharStr = MAP_RUS_ENG[lCharStr.upper()] + #if lCapBool == True: lCharStr=lCharStr.upper() + if lCapBool == True: lShiftBool=True + lFoundBool=True + # Check eng (us) + lVarNameStr = f"KEY_ENG_{lCharStr.upper()}" + if lVarNameStr in lVarList and lFoundBool == False: + lNewLayoutStr=getattr(lModuleKeyboard, "KEY_ENG_LAYOUT") + lFoundBool=True + if lFoundBool == False: lNewLayoutStr=getattr(lModuleKeyboard, "KEY_ENG_LAYOUT") + # CHECK LAST LAYOUT + if lNewLayoutStr != lLayoutStr: + #print(f"setxkbmap -layout {lNewLayoutStr}") + os.system(f"setxkbmap -layout {lNewLayoutStr}") + lLayoutStr = lNewLayoutStr + if lShiftBool == True: pyautogui.keyDown('shift') # hold down the shift key + pyautogui.write(lCharStr, interval = inDelayFloat) + if lShiftBool == True: pyautogui.keyUp('shift') # hold down the shift key + + # Set 2 layout with alt+shift switch + os.system(f"setxkbmap -layout {getattr(lModuleKeyboard, 'KEY_ENG_LAYOUT')},{getattr(lModuleKeyboard, 'KEY_RUS_LAYOUT')} -option grp:alt_shift_toggle") + def HotkeyCombination(*inKeyList, inDelaySecFloat = 0.3,inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """Получает перечень клавиш для одновременного нажатия. Между нажатиями программа ожидания время inDelaySecFloat ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ @@ -357,4 +474,4 @@ def Wait(inKeyInt:int,inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): wait(hotkey=inKeyInt) time.sleep(inWaitAfterSecFloat) -key_to_scan_codes("win") # 2022 06 10 Люблю смотреть скан код клавиши Виндовс :) \ No newline at end of file +if CrossOS.IS_WINDOWS_BOOL: key_to_scan_codes("win") # 2022 06 10 Люблю смотреть скан код клавиши Виндовс :) diff --git a/Utils/Jupyter-notebooks/Keyboard.ipynb b/Utils/Jupyter-notebooks/Keyboard.ipynb index 9a0cf8f9..499091e7 100644 --- a/Utils/Jupyter-notebooks/Keyboard.ipynb +++ b/Utils/Jupyter-notebooks/Keyboard.ipynb @@ -9,13 +9,21 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import sys\n", "import os\n", - "sys.path.insert(0, os.path.abspath(\"..\\\\..\\\\Sources\"))\n", + "#sys.path.insert(0, os.path.abspath(\"..\\\\..\\\\Sources\")) # FOR WINDOWS\n", + "sys.path.insert(0, os.path.abspath(\"../../Sources\")) # FOR LINUX\n", "import time\n", "from pyOpenRPA.Robot import Keyboard" ] @@ -41,6 +49,21 @@ "print(\"done\")" ] }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Keyboard: Взаимодействие с клавиатурой\n", + "from pyOpenRPA.Robot import Keyboard\n", + "import time\n", + "time.sleep(2)\n", + "Keyboard.Send(Keyboard.KEY_ENG_E)\n", + "Keyboard.Send(Keyboard.KEY_RUS_Ш)\n", + "ei" + ] + }, { "cell_type": "code", "execution_count": 25, @@ -210,246 +233,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['HotkeyCombination',\n", - " 'HotkeyCtrlA_CtrlC',\n", - " 'KEY_DOWN',\n", - " 'KEY_ENG_A',\n", - " 'KEY_ENG_B',\n", - " 'KEY_ENG_C',\n", - " 'KEY_ENG_D',\n", - " 'KEY_ENG_E',\n", - " 'KEY_ENG_F',\n", - " 'KEY_ENG_G',\n", - " 'KEY_ENG_H',\n", - " 'KEY_ENG_I',\n", - " 'KEY_ENG_J',\n", - " 'KEY_ENG_K',\n", - " 'KEY_ENG_L',\n", - " 'KEY_ENG_M',\n", - " 'KEY_ENG_N',\n", - " 'KEY_ENG_O',\n", - " 'KEY_ENG_P',\n", - " 'KEY_ENG_Q',\n", - " 'KEY_ENG_R',\n", - " 'KEY_ENG_S',\n", - " 'KEY_ENG_T',\n", - " 'KEY_ENG_U',\n", - " 'KEY_ENG_V',\n", - " 'KEY_ENG_W',\n", - " 'KEY_ENG_X',\n", - " 'KEY_ENG_Y',\n", - " 'KEY_ENG_Z',\n", - " 'KEY_HOT_0',\n", - " 'KEY_HOT_1',\n", - " 'KEY_HOT_2',\n", - " 'KEY_HOT_3',\n", - " 'KEY_HOT_4',\n", - " 'KEY_HOT_5',\n", - " 'KEY_HOT_6',\n", - " 'KEY_HOT_7',\n", - " 'KEY_HOT_8',\n", - " 'KEY_HOT_9',\n", - " 'KEY_HOT_ALT_LEFT',\n", - " 'KEY_HOT_ALT_RIGHT',\n", - " 'KEY_HOT_APOSTROPHE',\n", - " 'KEY_HOT_BACKSPACE',\n", - " 'KEY_HOT_CAPS_LOCK',\n", - " 'KEY_HOT_CLEAR',\n", - " 'KEY_HOT_COLON',\n", - " 'KEY_HOT_CONTEXT_MENU',\n", - " 'KEY_HOT_CTRL_LEFT',\n", - " 'KEY_HOT_CTRL_RIGHT',\n", - " 'KEY_HOT_DELETE',\n", - " 'KEY_HOT_DOWN',\n", - " 'KEY_HOT_END',\n", - " 'KEY_HOT_ENTER',\n", - " 'KEY_HOT_ESC',\n", - " 'KEY_HOT_F1',\n", - " 'KEY_HOT_F10',\n", - " 'KEY_HOT_F11',\n", - " 'KEY_HOT_F12',\n", - " 'KEY_HOT_F13',\n", - " 'KEY_HOT_F14',\n", - " 'KEY_HOT_F15',\n", - " 'KEY_HOT_F16',\n", - " 'KEY_HOT_F17',\n", - " 'KEY_HOT_F18',\n", - " 'KEY_HOT_F19',\n", - " 'KEY_HOT_F2',\n", - " 'KEY_HOT_F20',\n", - " 'KEY_HOT_F21',\n", - " 'KEY_HOT_F22',\n", - " 'KEY_HOT_F23',\n", - " 'KEY_HOT_F24',\n", - " 'KEY_HOT_F3',\n", - " 'KEY_HOT_F4',\n", - " 'KEY_HOT_F5',\n", - " 'KEY_HOT_F6',\n", - " 'KEY_HOT_F7',\n", - " 'KEY_HOT_F8',\n", - " 'KEY_HOT_F9',\n", - " 'KEY_HOT_GREATER_THAN',\n", - " 'KEY_HOT_HOME',\n", - " 'KEY_HOT_INSERT',\n", - " 'KEY_HOT_LEFT',\n", - " 'KEY_HOT_LESS_THAN',\n", - " 'KEY_HOT_MINUS',\n", - " 'KEY_HOT_NUMPAD_0',\n", - " 'KEY_HOT_NUMPAD_1',\n", - " 'KEY_HOT_NUMPAD_2',\n", - " 'KEY_HOT_NUMPAD_3',\n", - " 'KEY_HOT_NUMPAD_4',\n", - " 'KEY_HOT_NUMPAD_5',\n", - " 'KEY_HOT_NUMPAD_6',\n", - " 'KEY_HOT_NUMPAD_7',\n", - " 'KEY_HOT_NUMPAD_8',\n", - " 'KEY_HOT_NUMPAD_9',\n", - " 'KEY_HOT_NUMPAD_ASTERISK',\n", - " 'KEY_HOT_NUMPAD_DELETE',\n", - " 'KEY_HOT_NUMPAD_ENTER',\n", - " 'KEY_HOT_NUMPAD_MINUS',\n", - " 'KEY_HOT_NUMPAD_PLUS',\n", - " 'KEY_HOT_NUMPAD_SOLIDUS',\n", - " 'KEY_HOT_NUM_LOCK',\n", - " 'KEY_HOT_PAGE_DOWN',\n", - " 'KEY_HOT_PAGE_UP',\n", - " 'KEY_HOT_PLUS',\n", - " 'KEY_HOT_PRINT_SCREEN',\n", - " 'KEY_HOT_RIGHT',\n", - " 'KEY_HOT_SCROLL_LOCK',\n", - " 'KEY_HOT_SHIFT_LEFT',\n", - " 'KEY_HOT_SHIFT_RIGHT',\n", - " 'KEY_HOT_SOLIDUS',\n", - " 'KEY_HOT_SPACE',\n", - " 'KEY_HOT_SQUARE_BRACKET_LEFT',\n", - " 'KEY_HOT_SQUARE_BRACKET_RIGHT',\n", - " 'KEY_HOT_TAB',\n", - " 'KEY_HOT_TILDE',\n", - " 'KEY_HOT_UP',\n", - " 'KEY_HOT_VERTICAL_LINE',\n", - " 'KEY_HOT_WIN_LEFT',\n", - " 'KEY_HOT_WIN_RIGHT',\n", - " 'KEY_RUS_Ё',\n", - " 'KEY_RUS_А',\n", - " 'KEY_RUS_Б',\n", - " 'KEY_RUS_В',\n", - " 'KEY_RUS_Г',\n", - " 'KEY_RUS_Д',\n", - " 'KEY_RUS_Е',\n", - " 'KEY_RUS_Ж',\n", - " 'KEY_RUS_З',\n", - " 'KEY_RUS_И',\n", - " 'KEY_RUS_Й',\n", - " 'KEY_RUS_К',\n", - " 'KEY_RUS_Л',\n", - " 'KEY_RUS_М',\n", - " 'KEY_RUS_Н',\n", - " 'KEY_RUS_О',\n", - " 'KEY_RUS_П',\n", - " 'KEY_RUS_Р',\n", - " 'KEY_RUS_С',\n", - " 'KEY_RUS_Т',\n", - " 'KEY_RUS_У',\n", - " 'KEY_RUS_Ф',\n", - " 'KEY_RUS_Х',\n", - " 'KEY_RUS_Ц',\n", - " 'KEY_RUS_Ч',\n", - " 'KEY_RUS_Ш',\n", - " 'KEY_RUS_Щ',\n", - " 'KEY_RUS_Ъ',\n", - " 'KEY_RUS_Ы',\n", - " 'KEY_RUS_Ь',\n", - " 'KEY_RUS_Э',\n", - " 'KEY_RUS_Ю',\n", - " 'KEY_RUS_Я',\n", - " 'KEY_UP',\n", - " 'KeyboardEvent',\n", - " 'Send',\n", - " 'Wait',\n", - " 'Write',\n", - " '__builtins__',\n", - " '__cached__',\n", - " '__doc__',\n", - " '__file__',\n", - " '__loader__',\n", - " '__name__',\n", - " '__package__',\n", - " '__spec__',\n", - " 'add_abbreviation',\n", - " 'add_hotkey',\n", - " 'add_word_listener',\n", - " 'all_modifiers',\n", - " 'block_key',\n", - " 'call_later',\n", - " 'clear_all_hotkeys',\n", - " 'clear_hotkey',\n", - " 'get_hotkey_name',\n", - " 'get_typed_strings',\n", - " 'hook',\n", - " 'hook_key',\n", - " 'is_modifier',\n", - " 'is_pressed',\n", - " 'key_to_scan_codes',\n", - " 'normalize_name',\n", - " 'on_press',\n", - " 'on_press_key',\n", - " 'on_release',\n", - " 'on_release_key',\n", - " 'parse_hotkey',\n", - " 'parse_hotkey_combinations',\n", - " 'play',\n", - " 'press',\n", - " 'press_and_release',\n", - " 'read_event',\n", - " 'read_hotkey',\n", - " 'read_key',\n", - " 'record',\n", - " 'register_abbreviation',\n", - " 'register_hotkey',\n", - " 'register_word_listener',\n", - " 'release',\n", - " 'remap_hotkey',\n", - " 'remap_key',\n", - " 'remove_abbreviation',\n", - " 'remove_all_hotkeys',\n", - " 'remove_hotkey',\n", - " 'remove_word_listener',\n", - " 'replay',\n", - " 'restore_modifiers',\n", - " 'restore_state',\n", - " 'send',\n", - " 'sided_modifiers',\n", - " 'start_recording',\n", - " 'stash_state',\n", - " 'stop_recording',\n", - " 'time',\n", - " 'unblock_key',\n", - " 'unhook',\n", - " 'unhook_all',\n", - " 'unhook_all_hotkeys',\n", - " 'unhook_key',\n", - " 'unregister_all_hotkeys',\n", - " 'unregister_hotkey',\n", - " 'unremap_hotkey',\n", - " 'unremap_key',\n", - " 'wait',\n", - " 'write']" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(Keyboard)" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", @@ -509,6 +296,107 @@ "k()" ] }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"KEY_RUS_А\" in dir(Keyboard)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "module 'pyOpenRPA.Robot.Keyboard' has no attribute 'KEY_RUS_'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [6]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mKeyboard\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mKEY_RUS_\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mAttributeError\u001b[0m: module 'pyOpenRPA.Robot.Keyboard' has no attribute 'KEY_RUS_'" + ] + } + ], + "source": [ + "getattr(Keyboard, \"KEY_RUS_\")" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "time.sleep(3)\n", + "Keyboard.Write(\"HelloПривет!йцукенгшщзхъфывапролджэячсмитьбю.ёЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Hi anybody\", inDelayFloat=0.001)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "HelloПривет!йцукенгшщзхъфывапролджэячсмитьбю.ёЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Hi anybody" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "HelloПривет!йцукенгшщзхъфывапролджэячсмитьбю.ёЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,Hi anybody" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null,