@ -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,6 +161,8 @@ def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2):
for lBox in inBox :
BoxDraw ( inBox = lBox , inColorStr = inColorStr , inThicknessInt = inThicknessInt )
else :
# Windows case
if CrossOS . IS_WINDOWS_BOOL :
fill = win32defines . BS_NULL
if inBox is not None :
"""
@ -200,10 +204,32 @@ def BoxDraw(inBox, inColorStr='green',inThicknessInt = 2):
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 , опциональный