diff --git a/Sources/pyOpenRPA/Robot/Screen.py b/Sources/pyOpenRPA/Robot/Screen.py index 9ad4ba9b..d0432640 100644 --- a/Sources/pyOpenRPA/Robot/Screen.py +++ b/Sources/pyOpenRPA/Robot/Screen.py @@ -6,6 +6,8 @@ from pyOpenRPA.Tools import CrossOS from . import Mouse if CrossOS.IS_WINDOWS_BOOL: from pywinauto import win32defines, win32structures, win32functions +elif CrossOS.IS_LINUX_BOOL: + import tkinter as tk # Python 3 import time @@ -14,7 +16,7 @@ IMAGE_WAIT_INTERVAL_SEC_FLOAT = 1.0 def BoxCreate(inTopInt:int, inLeftInt:int, inHeightInt:int, inWidthInt:int) -> pyscreeze.Box: - """Создать экземпляр прямоугольной области. + """L+,W+: Создать экземпляр прямоугольной области. !ВНИМАНИЕ! Координаты inTopInt, inLeftInt определяют верхний левый край прямоугольной области. @@ -33,7 +35,7 @@ def BoxNormalize(*inArgList, **inAgrDict) -> list: pass def BoxMoveTo(inBox, inDXInt=None, inDYInt=None): - """Переместить прямоугольную область (сохранить длину/ширину). + """L+,W+: Переместить прямоугольную область (сохранить длину/ширину). !ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX @@ -70,7 +72,7 @@ def BoxMoveTo(inBox, inDXInt=None, inDYInt=None): inHeightInt=inBox.height, inWidthInt=inBox.width) def BoxModify(inBox, inDWidthInt=None, inDHeightInt=None, inPointRuleStr="CC"): - """Изменить ширину / высоту прямоугольной области. + """L+,W+: Изменить ширину / высоту прямоугольной области. !ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX @@ -127,9 +129,9 @@ def BoxModify(inBox, inDWidthInt=None, inDHeightInt=None, inPointRuleStr="CC"): def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2): - """ Выполнить подсветку прямоугольной области inBox на экране + """L+,W+: Выполнить подсветку прямоугольной области inBox на экране - !ВНИМАНИЕ! РАБОТАЕТ ТОЛЬКО НА ОС WINDOWS + !ВНИМАНИЕ! ЦВЕТ inColorStr ПОДДЕРЖИВАЕТСЯ ТОЛЬКО НА ОС WINDOWS !ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX @@ -159,51 +161,75 @@ def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2): for lBox in inBox: BoxDraw(inBox=lBox, inColorStr=inColorStr,inThicknessInt = inThicknessInt) else: - fill = win32defines.BS_NULL - if inBox is not None: - """ - Draw an outline around the window. - * **inColorStr** can be either an integer or one of 'red', 'green', 'blue' - (default 'green') - * **inThicknessInt** inThicknessInt of rectangle (default 2) - * **fill** how to fill in the rectangle (default BS_NULL) - """ - # don't draw if dialog is not visible - #if not lWrapperObject.is_visible(): - # return - colours = { - "green": 0x00ff00, - "blue": 0xff0000, - "red": 0x0000ff, - } - # if it's a known colour - if inColorStr in colours: - inColorStr = colours[inColorStr] - # create the pen(outline) - pen_handle = win32functions.CreatePen( - win32defines.PS_SOLID, inThicknessInt, inColorStr) - # create the brush (inside) - brush = win32structures.LOGBRUSH() - brush.lbStyle = fill - brush.lbHatch = win32defines.HS_DIAGCROSS - brush_handle = win32functions.CreateBrushIndirect(ctypes.byref(brush)) - # get the Device Context - dc = win32functions.CreateDC("DISPLAY", None, None, None ) - # push our objects into it - win32functions.SelectObject(dc, brush_handle) - win32functions.SelectObject(dc, pen_handle) - # draw the rectangle to the DC - win32functions.Rectangle( - dc, inBox.left, inBox.top, inBox.left+inBox.width, inBox.top+inBox.height) - # Delete the brush and pen we created - win32functions.DeleteObject(brush_handle) - win32functions.DeleteObject(pen_handle) - # delete the Display context that we created - win32functions.DeleteDC(dc) + # Windows case + if CrossOS.IS_WINDOWS_BOOL: + fill = win32defines.BS_NULL + if inBox is not None: + """ + Draw an outline around the window. + * **inColorStr** can be either an integer or one of 'red', 'green', 'blue' + (default 'green') + * **inThicknessInt** inThicknessInt of rectangle (default 2) + * **fill** how to fill in the rectangle (default BS_NULL) + """ + # don't draw if dialog is not visible + #if not lWrapperObject.is_visible(): + # return + colours = { + "green": 0x00ff00, + "blue": 0xff0000, + "red": 0x0000ff, + } + # if it's a known colour + if inColorStr in colours: + inColorStr = colours[inColorStr] + # create the pen(outline) + pen_handle = win32functions.CreatePen( + win32defines.PS_SOLID, inThicknessInt, inColorStr) + # create the brush (inside) + brush = win32structures.LOGBRUSH() + brush.lbStyle = fill + brush.lbHatch = win32defines.HS_DIAGCROSS + brush_handle = win32functions.CreateBrushIndirect(ctypes.byref(brush)) + # get the Device Context + dc = win32functions.CreateDC("DISPLAY", None, None, None ) + # push our objects into it + win32functions.SelectObject(dc, brush_handle) + win32functions.SelectObject(dc, pen_handle) + # draw the rectangle to the DC + win32functions.Rectangle( + dc, inBox.left, inBox.top, inBox.left+inBox.width, inBox.top+inBox.height) + # Delete the brush and pen we created + win32functions.DeleteObject(brush_handle) + win32functions.DeleteObject(pen_handle) + # delete the Display context that we created + win32functions.DeleteDC(dc) + elif CrossOS.IS_LINUX_BOOL: + if inBox is not None: + root = tk.Tk() + # The image must be stored to Tk or it will be garbage collected. + label = tk.Label(root, bg='red') + root.overrideredirect(True) + root.geometry(f"{inBox.width}x{inBox.height}+{inBox.left}+{inBox.top}") # WxH+X+Y + root.lift() + root.wm_attributes("-topmost", True) + #root.wm_attributes("-disabled", True) + root.wm_attributes("-alpha", 0.85) + root.wait_visibility(root) + # Create a canvas widget + #canvas=tk.Canvas(root, width=500, height=300) + #canvas.pack() + # Add a line in canvas widget + #canvas.create_line(100,200,500,350, fill="green", width=5) + #label.pack() + #label.mainloop() + #root.mainloop() + time.sleep(1) + root.destroy() def BoxAnchorRuleCheck(inBox, inAnchorBox=None, inAnchorRuleStr=None) -> bool: - """Выполнить проверку соответствия всем условиям вхождения inBox в inAnchorBox с учетом правил inAnchorRule + """L+,W+: Выполнить проверку соответствия всем условиям вхождения inBox в inAnchorBox с учетом правил inAnchorRule .. code-block:: python @@ -295,7 +321,7 @@ def BoxAnchorRuleCheck(inBox, inAnchorBox=None, inAnchorRuleStr=None) -> bool: return lResult def BoxOverlay(inBox1, inBox2) -> bool: - """Проверить наложение 2-х прямоугольных областей друг на друга. + """L+,W+:Проверить наложение 2-х прямоугольных областей друг на друга. .. code-block:: python @@ -317,7 +343,7 @@ def BoxOverlay(inBox1, inBox2) -> bool: import re def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point: - """Получить точку pyscreeze.Point по заданной прямоугольной области pyscreeze.Box и строковому параметру расположения inPointRuleStr. + """L+,W+:Получить точку pyscreeze.Point по заданной прямоугольной области pyscreeze.Box и строковому параметру расположения inPointRuleStr. .. code-block:: python @@ -355,7 +381,7 @@ def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point: return lPoint def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point: - """Скорректировать точку pyscreeze.Point. + """L+,W+:Скорректировать точку pyscreeze.Point. .. code-block:: python @@ -376,7 +402,7 @@ def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point: return PointCreate(inXInt=inPoint.x+inDXInt, inYInt=inPoint.y+inDYInt) def PointCreate(inXInt, inYInt): - """Создать точку pyscreeze.Point. + """L+,W+:Создать точку pyscreeze.Point. .. code-block:: python @@ -394,7 +420,7 @@ def PointCreate(inXInt, inYInt): 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): - """Нажатие (вниз) кнопки мыши и затем немедленно выпуск (вверх) её. Допускается следующая параметризация. + """L+,W+:Нажатие (вниз) кнопки мыши и затем немедленно выпуск (вверх) её. Допускается следующая параметризация. .. code-block:: python @@ -420,7 +446,7 @@ def PointClick(inPoint:pyscreeze.Point, inClickCountInt:int=1, inIntervalSecFloa def PointClickDouble(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): - """Двойное нажатие левой клавиши мыши. Данное действие аналогично вызову функции (см. ниже). + """L+,W+:Двойное нажатие левой клавиши мыши. Данное действие аналогично вызову функции (см. ниже). .. code-block:: python @@ -437,7 +463,7 @@ def PointClickDouble(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): Mouse.ClickDouble(inXInt=inPoint.x, inYInt=inPoint.y, inWaitAfterSecFloat=inWaitAfterSecFloat) def PointDown(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None): - """Переместить указатель по координатам inPoint, после чего нажать (вниз) клавишу мыши и не отпускать до выполнения соответсвующей команды (см. Up). + """L+,W+:Переместить указатель по координатам inPoint, после чего нажать (вниз) клавишу мыши и не отпускать до выполнения соответсвующей команды (см. Up). .. code-block:: python @@ -456,7 +482,7 @@ def PointDown(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFlo Mouse.Down(inXInt=inPoint.x, inYInt=inPoint.y,inButtonStr=inButtonStr, inWaitAfterSecFloat=inWaitAfterSecFloat) def PointUp(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None): - """Отпустить (вверх) клавишу мыши. + """L+,W+:Отпустить (вверх) клавишу мыши. .. code-block:: python @@ -475,7 +501,7 @@ def PointUp(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat Mouse.Up(inXInt=inPoint.x, inYInt=inPoint.y,inButtonStr=inButtonStr, inWaitAfterSecFloat=inWaitAfterSecFloat) def PointMoveTo(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): - """Переместить указатель мыши на позицию inXInt, inYInt за время inMoveDurationSecFloat. + """L+,W+:Переместить указатель мыши на позицию inXInt, inYInt за время inMoveDurationSecFloat. !ВНИМАНИЕ! Отсчет координат inXInt, inYInt начинается с левого верхнего края рабочей области (экрана). @@ -493,8 +519,10 @@ def PointMoveTo(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): """ Mouse.MoveTo(inXInt=inPoint.x, inYInt=inPoint.y, inWaitAfterSecFloat=inWaitAfterSecFloat) -def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0) -> list: - """Искать на экране графические объекты, которые похожи на inImgPathStr. Вернуть список прямоугольных областей на экране (pyscreeze.Box) +def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=None) -> list: + """L+W+: Искать на экране графические объекты, которые похожи на inImgPathStr. Вернуть список прямоугольных областей на экране (pyscreeze.Box) + + !ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python) .. code-block:: python @@ -506,19 +534,24 @@ def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFl :type inImgPathStr: str, относительный или абсолютный :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :type inIsGrayModeBool: bool, опционально - :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None) :type inConfidenceFloat: float, опционально :return: Список из pyscreeze.Box :rtype: list """ lResult = [] - for lItem in pyautogui.locateAllOnScreen(image = inImgPathStr, grayscale = inIsGrayModeBool, confidence = inConfidenceFloat): + if inConfidenceFloat is None: lLocateList = pyautogui.locateAllOnScreen(image = inImgPathStr, grayscale = inIsGrayModeBool) + else: lLocateList = pyautogui.locateAllOnScreen(image = inImgPathStr, grayscale = inIsGrayModeBool, confidence = inConfidenceFloat) + for lItem in lLocateList: lResult.append(lItem) return lResult -def ImageExists(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0) -> list: - """Проверить, имеется ли на экране хотя бы один подходящий объект. Вернуть булево значение +def ImageExists(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=None) -> list: + """L+,W+:Проверить, имеется ли на экране хотя бы один подходящий объект. Вернуть булево значение + + !ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python) + .. code-block:: python @@ -530,16 +563,20 @@ def ImageExists(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat :type inImgPathStr: str, относительный или абсолютный :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :type inIsGrayModeBool: bool, опционально - :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None) :type inConfidenceFloat: float, опционально :return: Список из pyscreeze.Box :rtype: list """ - return len(ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool, inConfidenceFloat=inConfidenceFloat))>0 + lLocateList = ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool, inConfidenceFloat=inConfidenceFloat) + return len(lLocateList)>0 + + +def ImageWaitAppear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = IMAGE_WAIT_INTERVAL_SEC_FLOAT, inIsGrayModeBool:bool=False, inConfidenceFloat:float=None) -> list: + """L+,W+:Ожидать появление изображения на протяжении inWaitSecFloat секунд. Проверять с периодичностью inWaitIntervalSecFloat. Вернуть список прямоугольных областей, которые удовлетворяют условию + !ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python) -def ImageWaitAppear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = IMAGE_WAIT_INTERVAL_SEC_FLOAT, inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0) -> list: - """Ожидать появление изображения на протяжении inWaitSecFloat секунд. Проверять с периодичностью inWaitIntervalSecFloat. Вернуть список прямоугольных областей, которые удовлетворяют условию .. code-block:: python @@ -555,7 +592,7 @@ def ImageWaitAppear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, :type inWaitIntervalSecFloat: float, опциональный :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :type inIsGrayModeBool: bool, опционально - :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None) :type inConfidenceFloat: float, опционально :return: Список из pyscreeze.Box или [] если прошло время ожидания. :rtype: list @@ -569,8 +606,11 @@ def ImageWaitAppear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, return lResultList -def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = IMAGE_WAIT_INTERVAL_SEC_FLOAT, inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0): - """Ожидать исчезновение изображения на протяжении inWaitSecFloat секунд. Проверять с периодичностью inWaitIntervalSecFloat. +def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = IMAGE_WAIT_INTERVAL_SEC_FLOAT, inIsGrayModeBool:bool=False, inConfidenceFloat:float=None): + """L+,W+:Ожидать исчезновение изображения на протяжении inWaitSecFloat секунд. Проверять с периодичностью inWaitIntervalSecFloat. + + !ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python) + .. code-block:: python @@ -586,7 +626,7 @@ def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLO :type inWaitIntervalSecFloat: float, опциональный :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :type inIsGrayModeBool: bool, опционально - :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None) :type inConfidenceFloat: float, опционально """ lStartSecFloat = time.time() @@ -597,8 +637,11 @@ def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLO time.sleep(inWaitIntervalSecFloat) return lResultList -def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0, inWaitSecFloat:float=0, inWaitIntervalSecFloat:float = 0): - """Выполнить поиск прямоугольной области по изображению. +def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", inIsGrayModeBool:bool=False, inConfidenceFloat:float=None, inWaitSecFloat:float=0, inWaitIntervalSecFloat:float = 0): + """L+,W+:Выполнить поиск прямоугольной области по изображению. + + !ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python) + .. code-block:: python @@ -614,7 +657,7 @@ def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", :type inPointRuleStr: str, опциональный :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :type inIsGrayModeBool: bool, опционально - :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None) :type inConfidenceFloat: float, опционально :param inWaitSecFloat: Время ожидания появления изображения в сек. По умолчанию 0 :type inWaitSecFloat: float, опциональный diff --git a/Sources/pyOpenRPA/Tools/CrossOS.py b/Sources/pyOpenRPA/Tools/CrossOS.py index e3ca7223..6ed4cae7 100644 --- a/Sources/pyOpenRPA/Tools/CrossOS.py +++ b/Sources/pyOpenRPA/Tools/CrossOS.py @@ -5,7 +5,7 @@ import platform Специфические команды, которые надо выполнять только на ОС семейства Windows: if OS.IS_WINDOWS_BOOL: """ -IS_LINUX_BOOL = (platform.system()=="Linux") +IS_LINUX_BOOL = (platform.system().upper()=="LINUX" or platform.system().upper()=="LINUX2") IS_WINDOWS_BOOL = (platform.system()=="Windows") def PathStr(inPathStr:str) -> str: diff --git a/Utils/Jupyter-notebooks/Screen.ipynb b/Utils/Jupyter-notebooks/Screen.ipynb index ac142918..d4fcc298 100644 --- a/Utils/Jupyter-notebooks/Screen.ipynb +++ b/Utils/Jupyter-notebooks/Screen.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 1, @@ -9,25 +16,28 @@ "import pyautogui\n", "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 Screen" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [ { - "ename": "NameError", - "evalue": "name 'Screen' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Создать пробную прямоугольную область\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mlBox\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mScreen\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mBoxCreate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minTopInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minLeftInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minHeightInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minWidthInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[0mlBoxX\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mScreen\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mBoxCreate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0minTopInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m60\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minLeftInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m60\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minHeightInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minWidthInt\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m100\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlBox\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;31m# Переместить пробную прямоугольную область\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNameError\u001b[0m: name 'Screen' is not defined" + "name": "stdout", + "output_type": "stream", + "text": [ + "Box(left=10, top=10, width=100, height=100)\n", + "Box(left=110, top=210, width=100, height=100)\n", + "Box(left=115, top=215, width=90, height=90)\n", + "Box(left=110, top=210, width=90, height=90)\n", + "Box(left=110, top=220, width=90, height=90)\n", + "Box(left=120, top=210, width=90, height=90)\n", + "Box(left=120, top=220, width=90, height=90)\n" ] } ], @@ -49,25 +59,39 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 9, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "expected an image filename, OpenCV numpy array, or PIL image", - "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[0;32m 1\u001b[0m \u001b[0mlg\u001b[0m\u001b[1;33m=\u001b[0m \u001b[0mpyautogui\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlocateAllOnScreen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"screencontact.PNG\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"screencontact2.PNG\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrayscale\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mconfidence\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m0.95\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mlbox\u001b[0m \u001b[1;33m=\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[1;32m----> 3\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mlitem\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mlg\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mlbox\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlitem\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Abs\\Archive\\scopeSrcUL\\pyOpenRPA\\Resources\\WPy64-3720\\python-3.7.2.amd64\\lib\\site-packages\\pyscreeze\\__init__.py\u001b[0m in \u001b[0;36m_locateAll_opencv\u001b[1;34m(needleImage, haystackImage, grayscale, limit, region, step, confidence)\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[0mconfidence\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfloat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mconfidence\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 145\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 146\u001b[1;33m \u001b[0mneedleImage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_load_cv2\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mneedleImage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrayscale\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 147\u001b[0m \u001b[0mneedleHeight\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mneedleWidth\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mneedleImage\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 148\u001b[0m \u001b[0mhaystackImage\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_load_cv2\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhaystackImage\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mgrayscale\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Abs\\Archive\\scopeSrcUL\\pyOpenRPA\\Resources\\WPy64-3720\\python-3.7.2.amd64\\lib\\site-packages\\pyscreeze\\__init__.py\u001b[0m in \u001b[0;36m_load_cv2\u001b[1;34m(img, grayscale)\u001b[0m\n\u001b[0;32m 125\u001b[0m \u001b[0mimg_cv\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcv2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcvtColor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mimg_cv\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcv2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mCOLOR_BGR2GRAY\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 126\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 127\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'expected an image filename, OpenCV numpy array, or PIL image'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 128\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mimg_cv\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 129\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mTypeError\u001b[0m: expected an image filename, OpenCV numpy array, or PIL image" + "name": "stdout", + "output_type": "stream", + "text": [ + "Box(left=348, top=545, width=10, height=11)\n", + "Box(left=365, top=545, width=10, height=11)\n", + "Box(left=407, top=545, width=10, height=11)\n", + "Box(left=424, top=545, width=10, height=11)\n", + "Box(left=483, top=545, width=10, height=11)\n", + "Box(left=500, top=545, width=10, height=11)\n", + "Box(left=542, top=545, width=10, height=11)\n", + "Box(left=559, top=545, width=10, height=11)\n", + "Box(left=601, top=545, width=10, height=11)\n", + "Box(left=618, top=545, width=10, height=11)\n", + "Box(left=660, top=545, width=10, height=11)\n", + "Box(left=677, top=545, width=10, height=11)\n", + "Box(left=736, top=545, width=10, height=11)\n", + "Box(left=753, top=545, width=10, height=11)\n", + "Box(left=795, top=545, width=10, height=11)\n", + "Box(left=812, top=545, width=10, height=11)\n", + "Box(left=854, top=545, width=10, height=11)\n", + "Box(left=871, top=545, width=10, height=11)\n", + "Box(left=913, top=545, width=10, height=11)\n", + "Box(left=930, top=545, width=10, height=11)\n" ] } ], "source": [ - "lg= pyautogui.locateAllOnScreen([\"screencontact.PNG\", \"screenconta-ct2.PNG\"], grayscale=False, confidence=0.95)\n", + "#lg= pyautogui.locateAllOnScreen([\"pic.PNG\"], grayscale=False, confidence=0.95)\n", + "lg= pyautogui.locateAllOnScreen(\"pic3.png\")\n", "lbox = {}\n", "for litem in lg:\n", " lbox = litem\n", @@ -76,43 +100,33 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 20, "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "'Box' object has no attribute 'sads'", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mAttributeError\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[0mlBox\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msads\u001b[0m\u001b[1;33m=\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[1;31mAttributeError\u001b[0m: 'Box' object has no attribute 'sads'" - ] - } - ], + "outputs": [], "source": [ - "lBox.sads= 20" + " # Screen: Взаимодействие с объектами экрана\n", + " from pyOpenRPA.Robot import Screen\n", + " lResult = Screen.ImageExists(inImgPathStr=\"pic.png\",inConfidenceFloat=None)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "False" + "True" ] }, - "execution_count": 1, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "type([]) is not list" + "lResult" ] }, { @@ -195,7 +209,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -209,7 +223,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.2" + "version": "3.10.5" }, "varInspector": { "cols": { diff --git a/Utils/Jupyter-notebooks/jupyter-notebook.sh b/Utils/Jupyter-notebooks/jupyter-notebook.sh new file mode 100644 index 00000000..9e33cce4 --- /dev/null +++ b/Utils/Jupyter-notebooks/jupyter-notebook.sh @@ -0,0 +1 @@ +./../../Resources/LPy64-3105/bin/python3.10 -m notebook --notebook-dir=$PWD