From d5392c32ad836c94a1ad95f20e807b41e27fbe2c Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Thu, 14 Jul 2022 14:44:54 +0300 Subject: [PATCH] Screen very well! --- Sources/pyOpenRPA/Robot/Screen.py | 113 +++++++++++++++++++++++++++++- 1 file changed, 111 insertions(+), 2 deletions(-) diff --git a/Sources/pyOpenRPA/Robot/Screen.py b/Sources/pyOpenRPA/Robot/Screen.py index 64b05ef1..dcf22871 100644 --- a/Sources/pyOpenRPA/Robot/Screen.py +++ b/Sources/pyOpenRPA/Robot/Screen.py @@ -7,7 +7,10 @@ from . import Mouse if CrossOS.IS_WINDOWS_BOOL: from pywinauto import win32defines, win32structures, win32functions +import time +IMAGE_WAIT_SEC_FLOAT = 60 +IMAGE_WAIT_INTERVAL_SEC_FLOAT = 1.0 def BoxCreate(inTopInt:int, inLeftInt:int, inHeightInt:int, inWidthInt:int) -> pyscreeze.Box: @@ -489,7 +492,7 @@ def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFl # Screen: Взаимодействие с объектами экрана from pyOpenRPA.Robot import Screen - Screen.LocateAll(inImgPathStr="Button.png",inConfidenceFloat=0.9) + Screen.ImageLocateAll(inImgPathStr="Button.png",inConfidenceFloat=0.9) :param inImgPathStr: Путь к изображению, которое требуется искать на экране :type inImgPathStr: str, относительный или абсолютный @@ -500,4 +503,110 @@ def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFl :return: Список из pyscreeze.Box :rtype: list """ - return pyautogui.locateAllOnScreen(image = inImgPathStr, grayscale = inIsGrayModeBool, confidence = inConfidenceFloat) + lResult = [] + for lItem in pyautogui.locateAllOnScreen(image = inImgPathStr, grayscale = inIsGrayModeBool, confidence = inConfidenceFloat): + lResult.append(lItem) + return lResult + + +def ImageExists(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0) -> list: + """Проверить, имеется ли на экране хотя бы один подходящий объект. Вернуть булево значение + + .. code-block:: python + + # Screen: Взаимодействие с объектами экрана + from pyOpenRPA.Robot import Screen + lResult = Screen.ImageExists(inImgPathStr="Button.png",inConfidenceFloat=0.9) + + :param inImgPathStr: Путь к изображению, которое требуется искать на экране + :type inImgPathStr: str, относительный или абсолютный + :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False + :type inIsGrayModeBool: bool, опционально + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :type inConfidenceFloat: float, опционально + :return: Список из pyscreeze.Box + :rtype: list + """ + return len(ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool, inConfidenceFloat=inConfidenceFloat))>0 + + +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 + + # Screen: Взаимодействие с объектами экрана + from pyOpenRPA.Robot import Screen + lBoxList = Screen.ImageWaitAppear(inImgPathStr="Button.png",inConfidenceFloat=0.9) + + :param inImgPathStr: Путь к изображению, которое требуется искать на экране + :type inImgPathStr: str, относительный или абсолютный + :param inWaitSecFloat: Время ожидания появления изображения в сек. По умолчанию IMAGE_WAIT_SEC_FLOAT (60) + :type inWaitSecFloat: float, опциональный + :param inWaitIntervalSecFloat: Интервал повторной проверки наличия изображения. По умолчанию IMAGE_WAIT_INTERVAL_SEC_FLOAT (1) + :type inWaitIntervalSecFloat: float, опциональный + :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False + :type inIsGrayModeBool: bool, опционально + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :type inConfidenceFloat: float, опционально + :return: Список из pyscreeze.Box или [] если прошло время ожидания. + :rtype: list + """ + lStartSecFloat = time.time() + lResultList=[] + while time.time() - lStartSecFloat < inWaitSecFloat: + lResultList = ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool, inConfidenceFloat=inConfidenceFloat) + if len(lResultList)>0: break + time.sleep(inWaitIntervalSecFloat) + 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. + + .. code-block:: python + + # Screen: Взаимодействие с объектами экрана + from pyOpenRPA.Robot import Screen + Screen.ImageWaitDisappear(inImgPathStr="Button.png",inConfidenceFloat=0.9) + + :param inImgPathStr: Путь к изображению, которое требуется искать на экране + :type inImgPathStr: str, относительный или абсолютный + :param inWaitSecFloat: Время ожидания появления изображения в сек. По умолчанию IMAGE_WAIT_SEC_FLOAT (60) + :type inWaitSecFloat: float, опциональный + :param inWaitIntervalSecFloat: Интервал повторной проверки наличия изображения. По умолчанию IMAGE_WAIT_INTERVAL_SEC_FLOAT (1) + :type inWaitIntervalSecFloat: float, опциональный + :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False + :type inIsGrayModeBool: bool, опционально + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :type inConfidenceFloat: float, опционально + """ + lStartSecFloat = time.time() + lResultList=[] + while time.time() - lStartSecFloat < inWaitSecFloat: + lResultList = ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool, inConfidenceFloat=inConfidenceFloat) + if len(lResultList)==0: break + time.sleep(inWaitIntervalSecFloat) + return lResultList + +def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC", inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0): + """Выполнить поиск прямоугольной области по изображению. + + .. code-block:: python + + # Screen: Взаимодействие с объектами экрана + from pyOpenRPA.Robot import Screen + Screen.ImageClick(inImgPathStr="Button.png",inConfidenceFloat=0.9) + + :param inImgPathStr: Путь к изображению, которое требуется искать на экране + :type inImgPathStr: str, относительный или абсолютный + :param inBoxIndexInt: Индекс прямоугольной области, по которой выполнить клик (если обнаружено несколько областей Box), По умолчанию 0 + :type inBoxIndexInt: int, опционально + :param inPointRuleStr: Правило идентификации точки на прямоугольной области (правила формирования см. выше). Варианты: "LU","CU","RU","LC","CC","RC","LD","CD","RD". По умолчанию "CC" + :type inPointRuleStr: str, опциональный + :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False + :type inIsGrayModeBool: bool, опционально + :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 + :type inConfidenceFloat: float, опционально + """ + PointClick(BoxGetPoint(inBox=ImageLocateAll(inImgPathStr=inImgPathStr,inIsGrayModeBool=inIsGrayModeBool,inConfidenceFloat=inConfidenceFloat)[inBoxIndexInt],inPointRuleStr=inPointRuleStr))