From af476acde79b81a5536a89835a672e52efe29e9e Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 14 Jul 2022 13:52:09 +0300 Subject: [PATCH] Screen update --- Sources/GuideSphinx/Robot/07_screen.rst | 17 ++- Sources/pyOpenRPA/Robot/Mouse.py | 7 + Sources/pyOpenRPA/Robot/Screen.py | 173 +++++++++++++++++++++++- Utils/Jupyter-notebooks/Screen.ipynb | 31 +++++ 4 files changed, 223 insertions(+), 5 deletions(-) diff --git a/Sources/GuideSphinx/Robot/07_screen.rst b/Sources/GuideSphinx/Robot/07_screen.rst index 4eac82c6..2df970bd 100644 --- a/Sources/GuideSphinx/Robot/07_screen.rst +++ b/Sources/GuideSphinx/Robot/07_screen.rst @@ -21,22 +21,31 @@ pyOpenRPA - роботы помогут! ************************ Класс Box ************************ -Экземпляр класса pyscreeze.Box, который характеризует прямоугольную убласть на экране. +Экземпляр класса pyscreeze.Box, который характеризует прямоугольную область на экране. top - координата левой верхней точки в пикселях по оси X (горизонталь) left - координата левой верхней точки в пикселях по оси Y (вертикаль) height - расстояние вниз от левой верхней точки в пикселях width - расстояние вправо от левой верхней точки в пикселях + +************************ +Класс Point +************************ +Экземпляр класса pyscreeze.Point, который характеризует точку на экране. + +x - координата точки в пикселях по оси X (горизонталь) +y - координата точки в пикселях по оси Y (вертикаль) + ************************************************ Символьное указание точки (inPointRuleStr) ************************************************ -LU| |RU +LU|CU|RU -------- - |CC| +LC|CC|RC -------- -LD| |RD +LD|CD|RD Символьное указание точки - точка относительно которой выполнить изменение прямоугольной области. diff --git a/Sources/pyOpenRPA/Robot/Mouse.py b/Sources/pyOpenRPA/Robot/Mouse.py index e693a900..446053c4 100644 --- a/Sources/pyOpenRPA/Robot/Mouse.py +++ b/Sources/pyOpenRPA/Robot/Mouse.py @@ -29,6 +29,7 @@ def Click(inXInt:int=None, inYInt:int=None, inClickCountInt:int=1, inIntervalSec :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT click(x=inXInt, y=inYInt, clicks=inClickCountInt, interval=inIntervalSecFloat, button=inButtonStr, duration=inMoveDurationSecFloat) time.sleep(inWaitAfterSecFloat) @@ -52,6 +53,7 @@ def ClickDouble(inXInt:int=None, inYInt:int=None, inWaitAfterSecFloat:float=WAIT :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT doubleClick(x=inXInt, y=inYInt) time.sleep(inWaitAfterSecFloat) @@ -75,6 +77,7 @@ def Down(inXInt:int=None, inYInt:int=None, inButtonStr:str='left', inWaitAfterSe :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT mouseDown(x=inXInt, y=inYInt, button = inButtonStr) time.sleep(inWaitAfterSecFloat) @@ -98,6 +101,7 @@ def Up(inXInt:int=None, inYInt:int=None, inButtonStr:str='left', inWaitAfterSecF :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT mouseUp(x=inXInt, y=inYInt, button = inButtonStr) time.sleep(inWaitAfterSecFloat) @@ -121,6 +125,7 @@ def MoveTo(inXInt=None, inYInt=None, inMoveDurationSecFloat:float=0.0, inWaitAft :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT moveTo(x=inXInt, y=inYInt, duration=inMoveDurationSecFloat) time.sleep(inWaitAfterSecFloat) @@ -145,6 +150,7 @@ def ScrollVertical(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfterS :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT vscroll(inScrollClickCountInt, x=inXInt, y=inYInt) time.sleep(inWaitAfterSecFloat) @@ -169,5 +175,6 @@ def ScrollHorizontal(inScrollClickCountInt, inXInt=None, inYInt=None, inWaitAfte :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ + if inWaitAfterSecFloat == None: inWaitAfterSecFloat = WAIT_AFTER_SEC_FLOAT hscroll(inScrollClickCountInt, x=inXInt, y=inYInt) time.sleep(inWaitAfterSecFloat) diff --git a/Sources/pyOpenRPA/Robot/Screen.py b/Sources/pyOpenRPA/Robot/Screen.py index 50358503..caf008ba 100644 --- a/Sources/pyOpenRPA/Robot/Screen.py +++ b/Sources/pyOpenRPA/Robot/Screen.py @@ -2,6 +2,7 @@ from pyautogui import * import pyscreeze import ctypes from pyOpenRPA.Tools import CrossOS +from . import Mouse if CrossOS.IS_WINDOWS_BOOL: from pywinauto import win32defines, win32structures, win32functions @@ -308,4 +309,174 @@ def BoxOverlay(inBox1, inBox2) -> bool: :return: True - inBox1 наложен на inBox2 :rtype: bool """ - return not ((inBox1.left>inBox2.left + inBox2.width or inBox2.left>inBox1.left + inBox1.width) or (inBox1.top>inBox2.top + inBox2.height or inBox2.top>inBox1.top + inBox1.height)) \ No newline at end of file + return not ((inBox1.left>inBox2.left + inBox2.width or inBox2.left>inBox1.left + inBox1.width) or (inBox1.top>inBox2.top + inBox2.height or inBox2.top>inBox1.top + inBox1.height)) + + +def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point: + """Получить точку pyscreeze.Point по заданной прямоугольной области pyscreeze.Box и строковому параметру расположения inPointRuleStr. + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lBox1 = Screen.BoxCreate(inTopInt=10, inLeftInt=10, inHeightInt=100, inWidthInt=1000) + lPoint = Screen.BoxGetPoint(inBox=lBox1, inPointRuleStr="LC") + + :param inBox: Прямоугольная область на экране + :type inBox: pyscreeze.Box, обязательный + :param inPointRuleStr: Правило идентификации точки на прямоугольной области (правила формирования см. выше). Варианты: "LU","CU","RU","LC","CC","RC","LD","CD","RD". По умолчанию "CC" + :type inPointRuleStr: str, опциональный + :return: Точка на экране + :rtype: pyscreeze.Point + """ + inPointRuleStr = inPointRuleStr.upper() + if "CC" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top + inBox.height/2) + elif "LU" in inPointRuleStr: return pyscreeze.Point(x=inBox.left,y=inBox.top) + elif "RU" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top) + elif "CU" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top) + elif "LC" in inPointRuleStr: return pyscreeze.Point(x=inBox.left,y=inBox.top + inBox.height/2) + elif "RC" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top + inBox.height/2) + elif "LD" in inPointRuleStr: return pyscreeze.Point(x=inBox.left,y=inBox.top + inBox.height) + elif "CD" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width/2,y=inBox.top + inBox.height) + elif "RD" in inPointRuleStr: return pyscreeze.Point(x=inBox.left + inBox.width,y=inBox.top + inBox.height) + +def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point: + """Скорректировать точку pyscreeze.Point. + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(inXInt=10, inYInt=10) + lPoint = Screen.PointModify(inPoint=lPoint, inDXInt=90, inDYInt=10) + + :param inPoint: Точка на экране, по которой выполнить нажатие мыши + :type inPoint: pyscreeze.Point, обязательный + :param inDXInt: Смещение указателя мыши по оси X (горизонтальная ось). + :type inDXInt: int, опциональный + :param inDYInt: Смещение указателя мыши по оси Y (вертикальная ось). + :type inDYInt: int, опциональный + :return: Точка на экране + :rtype: pyscreeze.Point + """ + return PointCreate(inXInt=inPoint.x+inDXInt, inYInt=inPoint.y+inDYInt) + +def PointCreate(inXInt, inYInt): + """Создать точку pyscreeze.Point. + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(inXInt=10, inYInt=10) + + :param inXInt: Смещение указателя мыши по оси X (горизонтальная ось). + :type inXInt: int, опциональный + :param inYInt: Смещение указателя мыши по оси Y (вертикальная ось). + :type inYInt: int, опциональный + :return: Точка на экране + :rtype: pyscreeze.Point + """ + return pyscreeze.Point(x=inXInt,y=inYInt) + +def PointClick(inPoint:pyscreeze.Point, inClickCountInt:int=1, inIntervalSecFloat:float=0.0, inButtonStr:str='left', inMoveDurationSecFloat:float=0.0, inWaitAfterSecFloat:float=None): + """Нажатие (вниз) кнопки мыши и затем немедленно выпуск (вверх) её. Допускается следующая параметризация. + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(100,150) + Screen.PointClick(lPoint) #Выполнить нажатие левой клавиши мыши + + :param inPoint: Точка на экране, по которой выполнить нажатие мыши + :type inPoint: pyscreeze.Point, обязательный + :param inClickCountInt: Количество нажатий (вниз и вверх) кнопкой мыши, По умолчанию 1 + :type inClickCountInt: int, опциональный + :param inIntervalSecFloat: Интервал ожидания в секундах между нажатиями, По умолчанию 0.0 + :type inIntervalSecFloat: float, опциональный + :param inButtonStr: Номер кнопки, которую требуется нажать. Возможные варианты: 'left', 'middle', 'right' или 1, 2, 3. В остальных случаях инициирует исключение ValueError. По умолчанию 'left' + :type inButtonStr: str, опциональный + :param inMoveDurationSecFloat: Время перемещения указателя мыши, По умолчанию 0.0 (моментальное перемещение) + :type inMoveDurationSecFloat: float, опциональный + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) + :type inWaitAfterSecFloat: float, опциональный + """ + Mouse.Click(inXInt=inPoint.x, inYInt=inPoint.y, inClickCountInt=inClickCountInt, inIntervalSecFloat=inIntervalSecFloat, inButtonStr=inButtonStr, inMoveDurationSecFloat=inMoveDurationSecFloat, inWaitAfterSecFloat=inWaitAfterSecFloat) + + +def PointClickDouble(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): + """Двойное нажатие левой клавиши мыши. Данное действие аналогично вызову функции (см. ниже). + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(100,150) + Screen.PointClickDouble(lPoint) #Выполнить двойное нажатие левой клавиши мыши + + :param inPoint: Точка на экране, по которой выполнить нажатие мыши + :type inPoint: pyscreeze.Point, обязательный + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) + :type inWaitAfterSecFloat: float, опциональный + """ + Mouse.ClickDouble(inXInt=inPoint.x, inYInt=inPoint.y, inWaitAfterSecFloat=inWaitAfterSecFloat) + +def PointDown(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None): + """Переместить указатель по координатам inPoint, после чего нажать (вниз) клавишу мыши и не отпускать до выполнения соответсвующей команды (см. Up). + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(100,150) + Screen.PointDown(lPoint) + + :param inPoint: Точка на экране, по которой выполнить нажатие мыши + :type inPoint: pyscreeze.Point, обязательный + :param inButtonStr: Номер кнопки, которую требуется нажать. Возможные варианты: 'left', 'middle', 'right' или 1, 2, 3. В остальных случаях инициирует исключение ValueError. По умолчанию 'left' + :type inButtonStr: str, опциональный + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) + :type inWaitAfterSecFloat: float, опциональный + """ + Mouse.Down(inXInt=inPoint.x, inYInt=inPoint.y,inButtonStr=inButtonStr, inWaitAfterSecFloat=inWaitAfterSecFloat) + +def PointUp(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None): + """Отпустить (вверх) клавишу мыши. + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(100,150) + Screen.PointUp(lPoint) + + :param inPoint: Точка на экране, по которой выполнить нажатие мыши + :type inPoint: pyscreeze.Point, обязательный + :param inButtonStr: Номер кнопки, которую требуется поднять. Возможные варианты: 'left', 'middle', 'right' или 1, 2, 3. В остальных случаях инициирует исключение ValueError. По умолчанию 'left' + :type inButtonStr: str, опциональный + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) + :type inWaitAfterSecFloat: float, опциональный + """ + Mouse.Down(inXInt=inPoint.x, inYInt=inPoint.y,inButtonStr=inButtonStr, inWaitAfterSecFloat=inWaitAfterSecFloat) + +def PointMoveTo(inPoint:pyscreeze.Point, inMoveDurationSecFloat:float=0.0, inWaitAfterSecFloat:float=None): + """Переместить указатель мыши на позицию inXInt, inYInt за время inMoveDurationSecFloat. + + !ВНИМАНИЕ! Отсчет координат inXInt, inYInt начинается с левого верхнего края рабочей области (экрана). + + .. code-block:: python + + # Screen: Взаимодействие с мышью объектами экрана + from pyOpenRPA.Robot import Screen + lPoint = Screen.PointCreate(100,150) + Mouse.PointMoveTo(inXInt=100, inYInt=200) + + :param inPoint: Точка на экране, по которой выполнить нажатие мыши + :type inPoint: pyscreeze.Point, обязательный + :param inMoveDurationSecFloat: Время перемещения указателя мыши, По умолчанию 0.0 (моментальное перемещение) + :type inMoveDurationSecFloat: float, опциональный + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Mouse (базовое значение 0.4) + :type inWaitAfterSecFloat: float, опциональный + """ + Mouse.Down(inXInt=inPoint.x, inYInt=inPoint.y, inMoveDurationSecFloat=inMoveDurationSecFloat, inWaitAfterSecFloat=inWaitAfterSecFloat) diff --git a/Utils/Jupyter-notebooks/Screen.ipynb b/Utils/Jupyter-notebooks/Screen.ipynb index ab2a7819..ac142918 100644 --- a/Utils/Jupyter-notebooks/Screen.ipynb +++ b/Utils/Jupyter-notebooks/Screen.ipynb @@ -154,6 +154,37 @@ "print(l)" ] }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "def test(): print(1)\n", + "def test(t): print(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "test() missing 1 required positional argument: 't'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mtest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m: test() missing 1 required positional argument: 't'" + ] + } + ], + "source": [ + "test()" + ] + }, { "cell_type": "code", "execution_count": null,