Robot.Screen ready for Linux! Jupyter linux .sh, cross os fix

dev-linux
Mikhail 2 years ago
parent f53360f7c5
commit 5f45962173

@ -6,6 +6,8 @@ from pyOpenRPA.Tools import CrossOS
from . import Mouse from . import Mouse
if CrossOS.IS_WINDOWS_BOOL: if CrossOS.IS_WINDOWS_BOOL:
from pywinauto import win32defines, win32structures, win32functions from pywinauto import win32defines, win32structures, win32functions
elif CrossOS.IS_LINUX_BOOL:
import tkinter as tk # Python 3
import time 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: def BoxCreate(inTopInt:int, inLeftInt:int, inHeightInt:int, inWidthInt:int) -> pyscreeze.Box:
"""Создать экземпляр прямоугольной области. """L+,W+: Создать экземпляр прямоугольной области.
!ВНИМАНИЕ! Координаты inTopInt, inLeftInt определяют верхний левый край прямоугольной области. !ВНИМАНИЕ! Координаты inTopInt, inLeftInt определяют верхний левый край прямоугольной области.
@ -33,7 +35,7 @@ def BoxNormalize(*inArgList, **inAgrDict) -> list:
pass pass
def BoxMoveTo(inBox, inDXInt=None, inDYInt=None): def BoxMoveTo(inBox, inDXInt=None, inDYInt=None):
"""Переместить прямоугольную область (сохранить длину/ширину). """L+,W+: Переместить прямоугольную область (сохранить длину/ширину).
!ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX !ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX
@ -70,7 +72,7 @@ def BoxMoveTo(inBox, inDXInt=None, inDYInt=None):
inHeightInt=inBox.height, inWidthInt=inBox.width) inHeightInt=inBox.height, inWidthInt=inBox.width)
def BoxModify(inBox, inDWidthInt=None, inDHeightInt=None, inPointRuleStr="CC"): def BoxModify(inBox, inDWidthInt=None, inDHeightInt=None, inPointRuleStr="CC"):
"""Изменить ширину / высоту прямоугольной области. """L+,W+: Изменить ширину / высоту прямоугольной области.
!ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX !ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX
@ -127,9 +129,9 @@ def BoxModify(inBox, inDWidthInt=None, inDHeightInt=None, inPointRuleStr="CC"):
def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2): def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2):
""" Выполнить подсветку прямоугольной области inBox на экране """L+,W+: Выполнить подсветку прямоугольной области inBox на экране
!ВНИМАНИЕ! РАБОТАЕТ ТОЛЬКО НА ОС WINDOWS !ВНИМАНИЕ! ЦВЕТ inColorStr ПОДДЕРЖИВАЕТСЯ ТОЛЬКО НА ОС WINDOWS
!ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX !ВНИМАНИЕ! ПОДДЕРЖИВАЕТ ПАКЕТНУЮ ОБРАТКУ ПРИ ПЕРЕДАЧЕ СПИСКА ЭКЗЕМПЛЯРОВ BOX
@ -159,51 +161,75 @@ def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2):
for lBox in inBox: for lBox in inBox:
BoxDraw(inBox=lBox, inColorStr=inColorStr,inThicknessInt = inThicknessInt) BoxDraw(inBox=lBox, inColorStr=inColorStr,inThicknessInt = inThicknessInt)
else: else:
fill = win32defines.BS_NULL # Windows case
if inBox is not None: if CrossOS.IS_WINDOWS_BOOL:
""" fill = win32defines.BS_NULL
Draw an outline around the window. if inBox is not None:
* **inColorStr** can be either an integer or one of 'red', 'green', 'blue' """
(default 'green') Draw an outline around the window.
* **inThicknessInt** inThicknessInt of rectangle (default 2) * **inColorStr** can be either an integer or one of 'red', 'green', 'blue'
* **fill** how to fill in the rectangle (default BS_NULL) (default 'green')
""" * **inThicknessInt** inThicknessInt of rectangle (default 2)
# don't draw if dialog is not visible * **fill** how to fill in the rectangle (default BS_NULL)
#if not lWrapperObject.is_visible(): """
# return # don't draw if dialog is not visible
colours = { #if not lWrapperObject.is_visible():
"green": 0x00ff00, # return
"blue": 0xff0000, colours = {
"red": 0x0000ff, "green": 0x00ff00,
} "blue": 0xff0000,
# if it's a known colour "red": 0x0000ff,
if inColorStr in colours: }
inColorStr = colours[inColorStr] # if it's a known colour
# create the pen(outline) if inColorStr in colours:
pen_handle = win32functions.CreatePen( inColorStr = colours[inColorStr]
win32defines.PS_SOLID, inThicknessInt, inColorStr) # create the pen(outline)
# create the brush (inside) pen_handle = win32functions.CreatePen(
brush = win32structures.LOGBRUSH() win32defines.PS_SOLID, inThicknessInt, inColorStr)
brush.lbStyle = fill # create the brush (inside)
brush.lbHatch = win32defines.HS_DIAGCROSS brush = win32structures.LOGBRUSH()
brush_handle = win32functions.CreateBrushIndirect(ctypes.byref(brush)) brush.lbStyle = fill
# get the Device Context brush.lbHatch = win32defines.HS_DIAGCROSS
dc = win32functions.CreateDC("DISPLAY", None, None, None ) brush_handle = win32functions.CreateBrushIndirect(ctypes.byref(brush))
# push our objects into it # get the Device Context
win32functions.SelectObject(dc, brush_handle) dc = win32functions.CreateDC("DISPLAY", None, None, None )
win32functions.SelectObject(dc, pen_handle) # push our objects into it
# draw the rectangle to the DC win32functions.SelectObject(dc, brush_handle)
win32functions.Rectangle( win32functions.SelectObject(dc, pen_handle)
dc, inBox.left, inBox.top, inBox.left+inBox.width, inBox.top+inBox.height) # draw the rectangle to the DC
# Delete the brush and pen we created win32functions.Rectangle(
win32functions.DeleteObject(brush_handle) dc, inBox.left, inBox.top, inBox.left+inBox.width, inBox.top+inBox.height)
win32functions.DeleteObject(pen_handle) # Delete the brush and pen we created
# delete the Display context that we created win32functions.DeleteObject(brush_handle)
win32functions.DeleteDC(dc) 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: def BoxAnchorRuleCheck(inBox, inAnchorBox=None, inAnchorRuleStr=None) -> bool:
"""Выполнить проверку соответствия всем условиям вхождения inBox в inAnchorBox с учетом правил inAnchorRule """L+,W+: Выполнить проверку соответствия всем условиям вхождения inBox в inAnchorBox с учетом правил inAnchorRule
.. code-block:: python .. code-block:: python
@ -295,7 +321,7 @@ def BoxAnchorRuleCheck(inBox, inAnchorBox=None, inAnchorRuleStr=None) -> bool:
return lResult return lResult
def BoxOverlay(inBox1, inBox2) -> bool: def BoxOverlay(inBox1, inBox2) -> bool:
"""Проверить наложение 2-х прямоугольных областей друг на друга. """L+,W+:Проверить наложение 2-х прямоугольных областей друг на друга.
.. code-block:: python .. code-block:: python
@ -317,7 +343,7 @@ def BoxOverlay(inBox1, inBox2) -> bool:
import re import re
def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point: def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point:
"""Получить точку pyscreeze.Point по заданной прямоугольной области pyscreeze.Box и строковому параметру расположения inPointRuleStr. """L+,W+:Получить точку pyscreeze.Point по заданной прямоугольной области pyscreeze.Box и строковому параметру расположения inPointRuleStr.
.. code-block:: python .. code-block:: python
@ -355,7 +381,7 @@ def BoxGetPoint(inBox, inPointRuleStr="CC") -> pyscreeze.Point:
return lPoint return lPoint
def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point: def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point:
"""Скорректировать точку pyscreeze.Point. """L+,W+:Скорректировать точку pyscreeze.Point.
.. code-block:: python .. code-block:: python
@ -376,7 +402,7 @@ def PointModify(inPoint, inDXInt, inDYInt) -> pyscreeze.Point:
return PointCreate(inXInt=inPoint.x+inDXInt, inYInt=inPoint.y+inDYInt) return PointCreate(inXInt=inPoint.x+inDXInt, inYInt=inPoint.y+inDYInt)
def PointCreate(inXInt, inYInt): def PointCreate(inXInt, inYInt):
"""Создать точку pyscreeze.Point. """L+,W+:Создать точку pyscreeze.Point.
.. code-block:: python .. code-block:: python
@ -394,7 +420,7 @@ def PointCreate(inXInt, inYInt):
return pyscreeze.Point(x=inXInt,y=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): 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 .. code-block:: python
@ -420,7 +446,7 @@ def PointClick(inPoint:pyscreeze.Point, inClickCountInt:int=1, inIntervalSecFloa
def PointClickDouble(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): def PointClickDouble(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None):
"""Двойное нажатие левой клавиши мыши. Данное действие аналогично вызову функции (см. ниже). """L+,W+:Двойное нажатие левой клавиши мыши. Данное действие аналогично вызову функции (см. ниже).
.. code-block:: python .. 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) Mouse.ClickDouble(inXInt=inPoint.x, inYInt=inPoint.y, inWaitAfterSecFloat=inWaitAfterSecFloat)
def PointDown(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None): def PointDown(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None):
"""Переместить указатель по координатам inPoint, после чего нажать (вниз) клавишу мыши и не отпускать до выполнения соответсвующей команды (см. Up). """L+,W+:Переместить указатель по координатам inPoint, после чего нажать (вниз) клавишу мыши и не отпускать до выполнения соответсвующей команды (см. Up).
.. code-block:: python .. 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) Mouse.Down(inXInt=inPoint.x, inYInt=inPoint.y,inButtonStr=inButtonStr, inWaitAfterSecFloat=inWaitAfterSecFloat)
def PointUp(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None): def PointUp(inPoint:pyscreeze.Point, inButtonStr:str='left', inWaitAfterSecFloat:float=None):
"""Отпустить (вверх) клавишу мыши. """L+,W+:Отпустить (вверх) клавишу мыши.
.. code-block:: python .. 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) Mouse.Up(inXInt=inPoint.x, inYInt=inPoint.y,inButtonStr=inButtonStr, inWaitAfterSecFloat=inWaitAfterSecFloat)
def PointMoveTo(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None): def PointMoveTo(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None):
"""Переместить указатель мыши на позицию inXInt, inYInt за время inMoveDurationSecFloat. """L+,W+:Переместить указатель мыши на позицию inXInt, inYInt за время inMoveDurationSecFloat.
!ВНИМАНИЕ! Отсчет координат inXInt, inYInt начинается с левого верхнего края рабочей области (экрана). !ВНИМАНИЕ! Отсчет координат inXInt, inYInt начинается с левого верхнего края рабочей области (экрана).
@ -493,8 +519,10 @@ def PointMoveTo(inPoint:pyscreeze.Point, inWaitAfterSecFloat:float=None):
""" """
Mouse.MoveTo(inXInt=inPoint.x, inYInt=inPoint.y, inWaitAfterSecFloat=inWaitAfterSecFloat) Mouse.MoveTo(inXInt=inPoint.x, inYInt=inPoint.y, inWaitAfterSecFloat=inWaitAfterSecFloat)
def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=1.0) -> list: def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat:float=None) -> list:
"""Искать на экране графические объекты, которые похожи на inImgPathStr. Вернуть список прямоугольных областей на экране (pyscreeze.Box) """L+W+: Искать на экране графические объекты, которые похожи на inImgPathStr. Вернуть список прямоугольных областей на экране (pyscreeze.Box)
!ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python)
.. code-block:: python .. code-block:: python
@ -506,19 +534,24 @@ def ImageLocateAll(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFl
:type inImgPathStr: str, относительный или абсолютный :type inImgPathStr: str, относительный или абсолютный
:param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False
:type inIsGrayModeBool: bool, опционально :type inIsGrayModeBool: bool, опционально
:param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None)
:type inConfidenceFloat: float, опционально :type inConfidenceFloat: float, опционально
:return: Список из pyscreeze.Box :return: Список из pyscreeze.Box
:rtype: list :rtype: list
""" """
lResult = [] 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) lResult.append(lItem)
return lResult 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 .. code-block:: python
@ -530,16 +563,20 @@ def ImageExists(inImgPathStr:str, inIsGrayModeBool:bool=False, inConfidenceFloat
:type inImgPathStr: str, относительный или абсолютный :type inImgPathStr: str, относительный или абсолютный
:param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False
:type inIsGrayModeBool: bool, опционально :type inIsGrayModeBool: bool, опционально
:param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None)
:type inConfidenceFloat: float, опционально :type inConfidenceFloat: float, опционально
:return: Список из pyscreeze.Box :return: Список из pyscreeze.Box
:rtype: list :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 .. code-block:: python
@ -555,7 +592,7 @@ def ImageWaitAppear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT,
:type inWaitIntervalSecFloat: float, опциональный :type inWaitIntervalSecFloat: float, опциональный
:param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False
:type inIsGrayModeBool: bool, опционально :type inIsGrayModeBool: bool, опционально
:param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None)
:type inConfidenceFloat: float, опционально :type inConfidenceFloat: float, опционально
:return: Список из pyscreeze.Box или [] если прошло время ожидания. :return: Список из pyscreeze.Box или [] если прошло время ожидания.
:rtype: list :rtype: list
@ -569,8 +606,11 @@ def ImageWaitAppear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT,
return lResultList 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): def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = IMAGE_WAIT_INTERVAL_SEC_FLOAT, inIsGrayModeBool:bool=False, inConfidenceFloat:float=None):
"""Ожидать исчезновение изображения на протяжении inWaitSecFloat секунд. Проверять с периодичностью inWaitIntervalSecFloat. """L+,W+:Ожидать исчезновение изображения на протяжении inWaitSecFloat секунд. Проверять с периодичностью inWaitIntervalSecFloat.
!ВНИМАНИЕ! Для использования параметра точности inConfidenceFloat необходим пакет Python opencv-python (python -m pip install opencv-python)
.. code-block:: python .. code-block:: python
@ -586,7 +626,7 @@ def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLO
:type inWaitIntervalSecFloat: float, опциональный :type inWaitIntervalSecFloat: float, опциональный
:param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False
:type inIsGrayModeBool: bool, опционально :type inIsGrayModeBool: bool, опционально
:param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None)
:type inConfidenceFloat: float, опционально :type inConfidenceFloat: float, опционально
""" """
lStartSecFloat = time.time() lStartSecFloat = time.time()
@ -597,8 +637,11 @@ def ImageWaitDisappear(inImgPathStr:str, inWaitSecFloat:float=IMAGE_WAIT_SEC_FLO
time.sleep(inWaitIntervalSecFloat) time.sleep(inWaitIntervalSecFloat)
return lResultList 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 .. code-block:: python
@ -614,7 +657,7 @@ def ImageClick(inImgPathStr:str,inBoxIndexInt:int = 0, inPointRuleStr:str="CC",
:type inPointRuleStr: str, опциональный :type inPointRuleStr: str, опциональный
:param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False :param inIsGrayModeBool: True - выполнить поиск изображения в режиме серых оттенков (ускоряет производительность, если допускается искажение цвета). По умолчанию False
:type inIsGrayModeBool: bool, опционально :type inIsGrayModeBool: bool, опционально
:param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 :param inConfidenceFloat: Показатель точности. 1.0 - идентичное соответствие, 0.0 - полное несоответствие. По умолчанию 1.0 (None)
:type inConfidenceFloat: float, опционально :type inConfidenceFloat: float, опционально
:param inWaitSecFloat: Время ожидания появления изображения в сек. По умолчанию 0 :param inWaitSecFloat: Время ожидания появления изображения в сек. По умолчанию 0
:type inWaitSecFloat: float, опциональный :type inWaitSecFloat: float, опциональный

@ -5,7 +5,7 @@ import platform
Специфические команды, которые надо выполнять только на ОС семейства Windows: if OS.IS_WINDOWS_BOOL: Специфические команды, которые надо выполнять только на ОС семейства 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") IS_WINDOWS_BOOL = (platform.system()=="Windows")
def PathStr(inPathStr:str) -> str: def PathStr(inPathStr:str) -> str:

@ -1,5 +1,12 @@
{ {
"cells": [ "cells": [
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 1,
@ -9,25 +16,28 @@
"import pyautogui\n", "import pyautogui\n",
"import sys\n", "import sys\n",
"import os\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", "import time\n",
"from pyOpenRPA.Robot import Screen" "from pyOpenRPA.Robot import Screen"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"ename": "NameError", "name": "stdout",
"evalue": "name 'Screen' is not defined", "output_type": "stream",
"output_type": "error", "text": [
"traceback": [ "Box(left=10, top=10, width=100, height=100)\n",
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "Box(left=110, top=210, width=100, height=100)\n",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "Box(left=115, top=215, width=90, height=90)\n",
"\u001b[1;32m<ipython-input-1-e5d2939d0bc7>\u001b[0m in \u001b[0;36m<module>\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", "Box(left=110, top=210, width=90, height=90)\n",
"\u001b[1;31mNameError\u001b[0m: name 'Screen' is not defined" "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", "cell_type": "code",
"execution_count": 21, "execution_count": 9,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"ename": "TypeError", "name": "stdout",
"evalue": "expected an image filename, OpenCV numpy array, or PIL image", "output_type": "stream",
"output_type": "error", "text": [
"traceback": [ "Box(left=348, top=545, width=10, height=11)\n",
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "Box(left=365, top=545, width=10, height=11)\n",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "Box(left=407, top=545, width=10, height=11)\n",
"\u001b[1;32m<ipython-input-21-e180e6430255>\u001b[0m in \u001b[0;36m<module>\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", "Box(left=424, top=545, width=10, height=11)\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", "Box(left=483, top=545, width=10, height=11)\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", "Box(left=500, top=545, width=10, height=11)\n",
"\u001b[1;31mTypeError\u001b[0m: expected an image filename, OpenCV numpy array, or PIL image" "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": [ "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", "lbox = {}\n",
"for litem in lg:\n", "for litem in lg:\n",
" lbox = litem\n", " lbox = litem\n",
@ -76,43 +100,33 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 5, "execution_count": 20,
"metadata": {}, "metadata": {},
"outputs": [ "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<ipython-input-5-4a0c90a42f18>\u001b[0m in \u001b[0;36m<module>\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'"
]
}
],
"source": [ "source": [
"lBox.sads= 20" " # Screen: Взаимодействие с объектами экрана\n",
" from pyOpenRPA.Robot import Screen\n",
" lResult = Screen.ImageExists(inImgPathStr=\"pic.png\",inConfidenceFloat=None)"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 21,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"False" "True"
] ]
}, },
"execution_count": 1, "execution_count": 21,
"metadata": {}, "metadata": {},
"output_type": "execute_result" "output_type": "execute_result"
} }
], ],
"source": [ "source": [
"type([]) is not list" "lResult"
] ]
}, },
{ {
@ -195,7 +209,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
@ -209,7 +223,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.2" "version": "3.10.5"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {

@ -0,0 +1 @@
./../../Resources/LPy64-3105/bin/python3.10 -m notebook --notebook-dir=$PWD
Loading…
Cancel
Save