From eb05fcd322e39424e8d0fd480319b5ca0cd1a13a Mon Sep 17 00:00:00 2001 From: Ivan Maslov Date: Tue, 7 May 2019 20:05:10 +0300 Subject: [PATCH] #Robot_GUI_refactoring_100% --- Robot/GUI.py | 114 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/Robot/GUI.py b/Robot/GUI.py index ef8197a8..24c440a7 100644 --- a/Robot/GUI.py +++ b/Robot/GUI.py @@ -30,6 +30,7 @@ from threading import Timer #UIOTree - Recursive Dict of Dict ... (UI Parent -> Child hierarchy) #UIOInfo - Dict of UIO attributes #UIOActivity - Activity of the UIO (UI object) from the Pywinauto module +#UIOEI - UI Object info object #inActivitySpecificationDict: #{ @@ -95,7 +96,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): if inElement is None: #сформировать спецификацию на получение элемента lRootElementSpecification=[inSpecificationList[0]] - lRootElement=GetControl(lRootElementSpecification) + lRootElement=PWASpecification_Get_UIO(lRootElementSpecification) if lRootElement is not None: lChildrenList.append(lRootElement.wrapper_object()) #Елемент на вход поступил - выполнить его анализ @@ -138,7 +139,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): lChildrenItemNewSpecificationList[0]["depth_start"]=lChildrenItemNewSpecificationList[0]["depth_start"]-1 #pdb.set_trace() #Циклический вызов для всех детей со скорректированной спецификацией - lResultList.extend(PywinautoExtElementsGet(lChildrenItemNewSpecificationList,lChildrenItem)) + lResultList.extend(UIOSelector_Get_UIOList(lChildrenItemNewSpecificationList,lChildrenItem)) #Фильтрация if lFlagGoCheck: lFlagAddChild=True @@ -170,7 +171,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): if len(inSpecificationList)>1 and len(lChildrenList)>0 is not None: #Вызвать рекурсивно функцию получения следующего объекта, если в спецификации есть следующий объект for lChildElement in lChildrenList: - lResultList.extend(PywinautoExtElementsGet(inSpecificationList[1:],lChildElement)) + lResultList.extend(UIOSelector_Get_UIOList(inSpecificationList[1:],lChildElement)) else: lResultList.extend(lChildrenList) return lResultList @@ -182,7 +183,7 @@ def UIOSelector_Get_UIOList (inSpecificationList,inElement=None): def UIOSelector_Get_UIO (inSpecificationList,inElement=None): lResult=None #Получить родительский объект если на вход ничего не поступило - lResultList=PywinautoExtElementsGet(inSpecificationList,inElement) + lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement) if len(lResultList)>0: lResult=lResultList[0] return lResult @@ -198,7 +199,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray): if "backend" in inControlSpecificationArray[0]: lBackend=inControlSpecificationArray[0]["backend"] #Подготовка входного массива - inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) + inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray) #Выполнить идентификацию объектов, если передан массив lResultList=[]; lTempObject=None @@ -209,7 +210,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray): try: lRPAApplication.connect(**inControlSpecificationArray[0]) except Exception as e: - PywinautoExtTryToRestore(inControlSpecificationArray) + UIOSelector_TryRestore_Dict(inControlSpecificationArray) try: lRPAApplication.connect(**inControlSpecificationArray[0]) except Exception as e: @@ -219,7 +220,7 @@ def PWASpecification_Get_UIO(inControlSpecificationArray): #Скорректировано из-за недопонимания структуры lTempObject=lRPAApplication #Нормализация массива для целей выборки объекта (удаление конфликтующих ключей) - inControlSpecificationArray=ElementSpecificationListNormalize(inControlSpecificationArray) + inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray) #Циклическое прохождение к недрам объекта for lWindowSpecification in inControlSpecificationArray[0:]: lTempObject=lTempObject.window(**lWindowSpecification) @@ -247,8 +248,8 @@ def UIOSelector_SearchChildByMouse_UIO(inElementSpecification): (lX,lY) = win32api.GetCursorPos() lElementFounded={} #Создать карту пикселей и элементов - #####Внимание! Функция GUISearchElementByRootXY не написана - lElementFoundedList=GUISearchElementByRootXY(PywinautoExtElementGet(inElementSpecification),lX,lY) + #####Внимание! Функция UIOXY_SearchChild_ListDict не написана + lElementFoundedList=UIOXY_SearchChild_ListDict(UIOSelector_Get_UIO(inElementSpecification),lX,lY) #print(lElementFoundedList) lElementFounded=lElementFoundedList[-1]["element"] #Подсветить объект, если он мышь раньше стояла на другом объекте @@ -256,7 +257,7 @@ def UIOSelector_SearchChildByMouse_UIO(inElementSpecification): lGUISearchElementSelected = lElementFounded #Доработанная функция отрисовки if lElementFounded is not None: - draw_outline_new(lElementFounded) + UIO_Highlight(lElementFounded) else: #Была нажата клавиша Ctrl - выйти из цикла lFlagLoop=False; @@ -291,7 +292,7 @@ def UIOSelector_SearchChildByMouse_UIOTree(inElementSpecification): # lElement = None #else: #Получить информацию про объект - lItemInfo2.append(ElementInfoExportObject(lElement.element_info)) + lItemInfo2.append(UIOEI_Convert_UIOInfo(lElement.element_info)) #Дообогатить информацией об индексе ребенка в родительском объекте if "index" in lListItem: if lListItem["index"] is not None: @@ -348,10 +349,10 @@ def UIO_GetCtrlIndex_Int(inElement): #old name - PywinautoExtElementsGetInfo def UIOSelector_Get_UIOInfoList (inSpecificationList,inElement=None): #Получить родительский объект если на вход ничего не поступило - lResultList=PywinautoExtElementsGet(inSpecificationList,inElement) + lResultList=UIOSelector_Get_UIOList(inSpecificationList,inElement) lIterator = 0 for lItem in lResultList: - lResultList[lIterator]=ElementInfoExportObject(lResultList[lIterator].element_info) + lResultList[lIterator]=UIOEI_Convert_UIOInfo(lResultList[lIterator].element_info) lIterator = lIterator + 1 return lResultList @@ -360,7 +361,7 @@ def UIOSelector_Get_UIOInfoList (inSpecificationList,inElement=None): #inSpecificationList - UIOSelector #old name - PywinautoExtElementExist def UIOSelector_IsExist_Bool (inSpecificationList): - return len(PywinautoExtElementsGet(inSpecificationList))>0 + return len(UIOSelector_Get_UIOList(inSpecificationList))>0 #################################################################################################### #Wait for the UIO by the UIOSelector appear @@ -369,11 +370,11 @@ def UIOSelector_IsExist_Bool (inSpecificationList): #old name - PywinautoExtElementWaitAppear def UIOSelector_WaitAppear_Dict(inSpecificationList,inTimeout=60): lTimeoutSeconds = 0 - while (not PywinautoExtElementExist(inSpecificationList) and inTimeout>lTimeoutSeconds): + while (not UIOSelector_IsExist_Bool(inSpecificationList) and inTimeout>lTimeoutSeconds): lTimeoutSeconds = lTimeoutSeconds + 0.5 #Заснуть на полсекунды time.sleep(0.5) - return PywinautoExtElementExist(inSpecificationList) + return UIOSelector_IsExist_Bool(inSpecificationList) #################################################################################################### #Try to restore (maximize) window, if it's was minimized @@ -384,7 +385,7 @@ def UIOSelector_TryRestore_Dict(inSpecificationList): lResult={} try: #Подготовка взодного массива - inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inSpecificationList) + inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inSpecificationList) #Выполнить подключение к объекту. Восстановление необходимо только в бэке win32, #так как в uia свернутое окно не распознается lRPAApplication = pywinauto.Application(backend="win32") @@ -399,7 +400,7 @@ def UIOSelector_TryRestore_Dict(inSpecificationList): #old name - ElementActionGetList def UIOSelector_Get_UIOActivityList (inControlSpecificationArray): #Получить объект - lObject=PywinautoExtElementGet(inControlSpecificationArray) + lObject=UIOSelector_Get_UIO(inControlSpecificationArray) lActionList=dir(lObject) lResult=dir(lObject) #Выполнить чистку списка от неактуальных методов @@ -420,7 +421,7 @@ def UIOSelector_Get_UIOActivityList (inControlSpecificationArray): def UIOSelectorUIOActivity_Run_Dict(inControlSpecificationArray,inActionName,inArgumentList=[],inkwArgumentObject={}): lResult={} #Определить объект - lObject=PywinautoExtElementGet(inControlSpecificationArray) + lObject=UIOSelector_Get_UIO(inControlSpecificationArray) #Получить метод для вызова lFunction = getattr(lObject, inActionName) #Выполнить действие @@ -448,16 +449,16 @@ def UIOSelectorUIOActivity_Run_Dict(inControlSpecificationArray,inActionName,inA #old name - ElementGetInfo def UIOSelector_Get_UIOInfo(inControlSpecificationArray): #Подготовка входного массива - inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) + inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray) #Выполнить идентификацию объектов, если передан массив lResultList=[]; if len(inControlSpecificationArray) > 0: #Получить объект - lTempObject=PywinautoExtElementGet(inControlSpecificationArray) + lTempObject=UIOSelector_Get_UIO(inControlSpecificationArray) #Получить инфо объект lTempObjectInfo = lTempObject.element_info #Добавить информацию об обнаруженом объекте - lResultList.append(ElementInfoExportObject(lTempObjectInfo)); + lResultList.append(UIOEI_Convert_UIOInfo(lTempObjectInfo)); return lResultList @@ -500,7 +501,7 @@ def UIOXY_SearchChild_ListDict(inRootElement,inX,inY,inHierarchyList=[]): #Сформировать результирующий массив lChildFoundedHierarchyList = lParentHierarchy.copy() lChildFoundedHierarchyList.append({'index': lChildIterator}) - lChildFoundedHierarchyList = GUISearchElementByRootXY(lChildElement,inX,inY, lChildFoundedHierarchyList) + lChildFoundedHierarchyList = UIOXY_SearchChild_ListDict(lChildElement,inX,inY, lChildFoundedHierarchyList) lChildFoundedElement = lChildFoundedHierarchyList[-1]["element"] #Установить обнаруженный элемент, если текущий результат пустой if lResultElement is None and lChildFoundedElement is not None: @@ -556,13 +557,13 @@ def UIOXY_SearchChild_ListDict(inRootElement,inX,inY,inHierarchyList=[]): #old name - ElementGetChildElementList def UIOSelector_GetChildList_UIOList(inControlSpecificationArray=[]): #Подготовка входного массива - inControlSpecificationArray=ElementSpecificationArraySearchPrepare(inControlSpecificationArray) + inControlSpecificationArray=UIOSelector_SearchNormalize_UIOSelector(inControlSpecificationArray) #Выполнить идентификацию объектов, если передан массив lResultList=[]; #ctypes.windll.user32.MessageBoxW(0, str(inControlSpecificationArray), "Your title", 1) if len(inControlSpecificationArray) > 0: #Получить объект - lTempObject = PywinautoExtElementGet(inControlSpecificationArray) + lTempObject = UIOSelector_Get_UIO(inControlSpecificationArray) #Получить список дочерних объектов lTempChildList = lTempObject.children() lIterator=0 @@ -570,14 +571,14 @@ def UIOSelector_GetChildList_UIOList(inControlSpecificationArray=[]): for lChild in lTempChildList: lTempObjectInfo=lChild.element_info #Добавить информацию об обнаруженом объекте - lObjectInfoItem=ElementInfoExportObject(lTempObjectInfo) + lObjectInfoItem=UIOEI_Convert_UIOInfo(lTempObjectInfo) #Итератор внутри объекта (для точной идентификации) lObjectInfoItem['ctrl_index']=lIterator; lResultList.append(lObjectInfoItem); #Инкремент счетчика lIterator=lIterator+1 else: - lResultList=GetRootElementList() + lResultList=BackendStr_GetTopLevelList_UIOInfo() return lResultList #################################################################################################### @@ -643,17 +644,11 @@ def UIOSelector_SearchNormalize_UIOSelector (inControlSpecificationArray): #Вернуть результат return lResult - - -############################ -#Старая версия -############################ -mFlagIsDebug=False - - - -#Получить объект из атрибутов, которые удалось прочитать -def ElementInfoExportObject(inElementInfo): +#################################################################################################### +#Transfer UI object element info (pywinauto) to UIOInfo (dict of attributes) +#inElementInfo - UIOEI +#old name - ElementInfoExportObject +def UIOEI_Convert_UIOInfo(inElementInfo): #Подготовить выходную структуру данных lResult = {"title":None,"rich_text":None,"process_id":None,"process":None,"handle":None,"class_name":None,"control_type":None,"control_id":None,"rectangle":{"left":None,"top":None,"right":None,"bottom":None}, 'runtime_id':None} #Проверка name @@ -721,21 +716,35 @@ def ElementInfoExportObject(inElementInfo): #Вернуть результат return lResult -def GetRootElementList(): +################################################################################################### +#Get list of top level +#old name - GetRootElementList +def BackendStr_GetTopLevelList_UIOInfo(inBackend): #Получить список объектов lResultList=pywinauto.findwindows.find_elements(top_level_only=True,backend=mPywinautoActiveBackend) lResultList2=[] for lI in lResultList: lTempObjectInfo=lI - lResultList2.append(ElementInfoExportObject(lI)); + lResultList2.append(UIOEI_Convert_UIOInfo(lI)); return lResultList2 -def ElementDrawOutlineNew(inSpecificationArray): - draw_outline_new(PywinautoExtElementGet(inSpecificationArray)) + +################################################################################################### +#Highlight the UI object +#old name - ElementDrawOutlineNew +def UIOSelector_Highlight(inSpecificationArray): + UIO_Highlight(UIOSelector_Get_UIO(inSpecificationArray)) return -def ElementDrawOutlineNewFocus(inSpecificationArray): - draw_outline_new_focus(PywinautoExtElementGet(inSpecificationArray)) + +################################################################################################### +#inSpecificationArray - UIOSelector +#old name - ElementDrawOutlineNewFocus +def UIOSelector_FocusHighlight(inSpecificationArray): + UIO_FocusHighlight(UIOSelector_Get_UIO(inSpecificationArray)) return -def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False): + +################################################################################################### +#old name - draw_outline_new +def UIO_Highlight(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None,inFlagSetFocus=False): if lWrapperObject is not None: """ Draw an outline around the window. @@ -785,9 +794,20 @@ def draw_outline_new(lWrapperObject,colour='green',thickness=2,fill=win32defines win32functions.DeleteObject(pen_handle) # delete the Display context that we created win32functions.DeleteDC(dc) + +################################################################################################### #Аналог подсвечивания + установка фокуса -def draw_outline_new_focus(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None): - draw_outline_new(lWrapperObject,'green',2,win32defines.BS_NULL,None,True) +#old name - draw_outline_new_focus +def UIO_FocusHighlight(lWrapperObject,colour='green',thickness=2,fill=win32defines.BS_NULL,rect=None): + UIO_Highlight(lWrapperObject,'green',2,win32defines.BS_NULL,None,True) + + + + +############################ +#Старая версия +############################ +mFlagIsDebug=False #run() lText = "Bitness:" + str(struct.calcsize("P") * 8)