瀏覽代碼

COptionAction
1、back2ParentNode添加isReduce判断。
2、setOptionValue添加value类型判断来决定是否需要调用back2ParentNode

COptionConfig
1、__getICONConfig1如果变量opc_cfg已有值,不再跟随icon获取新值。

scbc.sat2 5 年之前
父節點
當前提交
ec77e29600
共有 3 個文件被更改,包括 149 次插入58 次删除
  1. 78 39
      ssat_sdk/MenuTree3/OptionAction.py
  2. 38 8
      ssat_sdk/MenuTree3/OptionConfig.py
  3. 33 11
      ssat_sdk/MenuTree3/logic.py

+ 78 - 39
ssat_sdk/MenuTree3/OptionAction.py

@@ -55,7 +55,6 @@ class COptionAction(CBaseLog):
     # 图片切割对象
     __imgCMP = ImageCMP()
 
-
     def __init__(self, optionName, optionValue, optionConfig, optionExcel):
         CBaseLog.__init__(self)
         # 层级位置;
@@ -102,9 +101,9 @@ class COptionAction(CBaseLog):
         return self.__optionValueText
 
     '''
-    函数:截图;
+    函数:截图并返回截图路径;
     参数:无
-    返回:    
+    返回:截图路径;    
     '''
     def takePicture(self):
         img = os.path.join(getSATTmpDIR(), "menutree_runpath.png")
@@ -115,8 +114,8 @@ class COptionAction(CBaseLog):
 
     '''
     函数:调用根节点快捷键(中间节点不需要快捷键;);
-    参数:
-    返回:
+    参数:
+    返回:
     '''
 
     def callFirstOptionShortCutKey(self):
@@ -127,9 +126,10 @@ class COptionAction(CBaseLog):
             self.warn(u"表格没有shortcut_key字段,执行默认的parent按键:%s" % self.__optionPaths['First']['parent'])
 
     '''
-    函数:调用当前结点的toparent_key
+    函数:调用当前结点的toparent_key(叫back_key会简单点)
     参数:
-    返回:
+        curOptionName       当前层级的目标节点.
+    返回:无
     '''
 
     def callCurOptionBackKey(self, curOptionName):
@@ -142,12 +142,9 @@ class COptionAction(CBaseLog):
 
     '''
     函数:是否在父节点菜单上。一般在执行了callFirstOptionShortCutKey后调用;
-    参数:
-    返回:
+    参数:
+    返回:Boolean, 数组(坐标)。 如:True, [0,0,1920,1080]
     注意:由于所有父节点上的子项都共用一个图片定位参数,所以只要随意一个父节点的子项option即可获取定位参数;
-    示例:
-    
-
     测试:。
     '''
 
@@ -161,11 +158,9 @@ class COptionAction(CBaseLog):
         每次移动到下一目标节点(option)上时,self.__pos + 1,表示移动到下一层路径。
         当self.__pos >= self.__optionPaths.__len__()时,表示到达value表格;
         所以,该类的重点在self.__pos的移动;
-    参数:
+    参数:
     返回:Boolean, 识别的文本/数字;
     示例:
-    
-    测试:。
     '''
 
     def isOnTargetNode(self):
@@ -230,7 +225,7 @@ class COptionAction(CBaseLog):
 
     '''
     函数:是否移到目标节点上(在isOnOption后,判断__pos位置是否在__paths最后);
-    参数:
+    参数:
     返回:Boolean.
     
     '''
@@ -301,7 +296,9 @@ class COptionAction(CBaseLog):
 
     '''
     函数:返回到父节点
-    参数:无
+    参数:
+        isReduce    是否需要自减层级。
+                    一般用于value节点返回时,才需要用到该参数(如果value节点设置值后,不是自动返回,要设置False)。
     返回:无
     
     注意:
@@ -311,7 +308,7 @@ class COptionAction(CBaseLog):
         如果不截图,可以不考虑sendKey的等待时间.
     '''
 
-    def back2ParentNode(self):
+    def back2ParentNode(self, isReduce=True):
         # 获取当前option信息;
         if self.getCurOptionInfo():
             backKey = self.__curOptionInfo['back_key']
@@ -323,7 +320,8 @@ class COptionAction(CBaseLog):
         else:
             self.sendKey(backKey, 1, 1)
         # 返回,自减;
-        self.__pos -= 1
+        if isReduce:
+            self.__pos -= 1
 
     '''
     函数:进入当前节点,只对路径节点有效,value节点不处理;
@@ -367,13 +365,14 @@ class COptionAction(CBaseLog):
 
     '''
     函数:设置目标option的值, 只设置数值型value和输入型value(选择型value不需要此步骤).
-    参数:
-    返回:
+    参数:
+    返回:
     
     注意:此函数必须是已聚焦在目标value节点上,否则无效。
     重要:
         在此函数enter后,UI是否返回到上一层父节点上,还是停留在本层节点不返回。
         建议在excel中配置这个关键信息,以便此函数可以正确更改self.__pos的值。
+        
     '''
 
     def setOptionValue(self):
@@ -394,11 +393,18 @@ class COptionAction(CBaseLog):
         # 是否有按键延时值;
         duration = float(others['duration']) if "duration" in others else 0.1
 
+        # 值类型:
+        # 0 表示默认选择类型.
+        # 1 表示输入类型(有些输入完了,正确值会自动进入).
+        # 2 表示进度条数据型.
+        valueType = 0
         # 是否为数字文本(特指:range(0, 100));
         isNumberText = self.isNumberText(valueText)
         # 数值型value;
         if isNumberText:
             if moveKey[0] == 'input':
+                # 标记值类型;
+                valueType = 1
                 # 将数值转成字符;
                 optionValue = self.__optionValue
                 if type(optionValue) == int or type(optionValue) == float:
@@ -407,23 +413,46 @@ class COptionAction(CBaseLog):
                 chList = list(optionValue)
                 self.sendKey(chList, 1, duration)
             else:
+                # 标记值类型;
+                valueType = 2
                 # 相差值;
                 num = int(self.__optionValue) - int(self.__optionValueText)
                 # 正->往右或下,负->往左或上;
                 self.sendKey(moveKey[1] if num > 0 else moveKey[0], abs(num), duration)
         elif moveKey[0] == 'input':
+            # 标记值类型;
+            valueType = 1
             # 将字符转成list;
             chList = list(self.__optionValue)
             self.sendKey(chList, 1, duration)
 
         # 最后,如果有进入键执行;
         if enterKey != 'default':
+            self.info(u"value节点具有enter key")
             self.sendKey(enterKey, 1, 0.1)
-
-    '''
-    函数:
-    参数:
-    返回:
+            # enter之后,可能会返回上层菜单,也可能不返回.
+            # if autoBackFlag is False:
+            #   self.back2ParentNode(False)
+        else:
+            if valueType == 0:
+                # 如果是选择型数据,没有enter键;
+                self.back2ParentNode(False)
+            elif valueType == 1:
+                pass
+                # 如果是输入型数据,没有enter键;
+                # 可能输入后,自动进入。需要根据autoBackFlag来判断;
+                # if autoBackFlag is False:
+                #   self.back2ParentNode(False)
+                # else:
+                #   self.__pos -= 1
+            elif valueType == 2:
+                # 如果是进度条数据,没有enter键;
+                self.back2ParentNode(False)
+
+    '''
+    函数:获取当前层级的目标option详细信息.
+    参数:无
+    返回:Boolean, 获取成功返回True
     '''
 
     def getCurOptionInfo(self):
@@ -447,8 +476,8 @@ class COptionAction(CBaseLog):
 
     '''
     函数:检测路径是否有效;
-    参数:
-    返回:Boolean
+    参数:
+    返回:Boolean, 检测正常返回True
     '''
     def checkRunOptionPath(self):
         outData = self.__optionExcel.checkOptionPaths(self.__optionPaths)
@@ -463,9 +492,10 @@ class COptionAction(CBaseLog):
         return True
 
     '''
-    函数:
+    函数:指定的value_for_ocr或option_for_ocr数组是否为range(xx,xx)类型。
     参数:
-    返回:
+        textList        value_for_ocr或option_for_ocr数组
+    返回:Boolean, 如果是range(xx,xx)类型返回True.
     '''
     def isNumberText(self, textList):
         # 是否获取数值文本;
@@ -481,11 +511,9 @@ class COptionAction(CBaseLog):
 
     '''
     函数:获取静态图片文本内容
-    参数:
+    参数:(略,请看调用函数)
     注意:
-    返回:Boolean、文本识别内容
-
-    测试:。
+    返回:Boolean、文本识别内容。成功识别出文本,返回True及文本内容。
     '''
 
     def __getStaticPicText(self, pic, optionName, optionTextList, siblingTextList, ocrConfigList, ocrThreshold,
@@ -578,8 +606,9 @@ class COptionAction(CBaseLog):
 
     '''
     函数:获取动态图片文本内容
-    参数:
-    返回:返回:Boolean、文本识别内容
+    参数:(略,请看调用函数)
+    注意:
+    返回:Boolean、文本识别内容。成功识别出文本,返回True及文本内容。
     '''
 
     def __getDynamicPicText(self, optionName, optionTextList, siblingTextList, ocrConfigList, ocrThreshold, marqueeDict,
@@ -664,15 +693,21 @@ class COptionAction(CBaseLog):
         return False, 0 if isNumberText else None
 
     '''
-    函数:
+    函数:获取option名称数组内所有option的详细信息.
     参数:
-    返回:
+        optionNameList      option名称数组。
+    返回:字典。
+        {
+            "option1": {self.__optionExcel.getOptionInfo(option1)[1]},
+            "option2": {self.__optionExcel.getOptionInfo(option2)[1]},
+            "option3": {self.__optionExcel.getOptionInfo(option3)[1]},
+        }
     '''
 
     def __getOptionInfoDict(self, optionNameList):
         OptionInfoDict = {}
         for optionName in optionNameList:
-            found, optionDict = self.__optionExcel(optionName)
+            found, optionDict = self.__optionExcel.getOptionInfo(optionName)
             if found:
                 OptionInfoDict[optionName] = optionDict
             # endif
@@ -682,6 +717,9 @@ class COptionAction(CBaseLog):
     '''
     函数:找到两个字符串左边或者右边相同的部分
     参数:
+        str1:
+        str2:
+        direction       方向,默认为right
     返回:
     '''
 
@@ -710,6 +748,7 @@ class COptionAction(CBaseLog):
     '''
     函数:去掉字符串数组中每个字符串 左边或右边相同的部分
     参数:
+        strList
     返回:
     '''
 

+ 38 - 8
ssat_sdk/MenuTree3/OptionConfig.py

@@ -58,6 +58,12 @@ class COptionConfig(TConfig, CBaseLog):
         return waitTime
 
     # 获取阀值字典;
+    '''
+    函数:获取指定option的阀值字典
+    参数:
+        optionName      节点名称;
+    返回:字典。
+    '''
     def getThresholdDict(self, optionName):
         section = "Threshold"
         thresholdDict = {}
@@ -113,7 +119,9 @@ class COptionConfig(TConfig, CBaseLog):
             self.warn(u"Option(%s)首配图片不存在:%s" % (optionName, icon_path))
             icon_path = os.path.join(self.__uiTreeDir, "icon\\" + cur_parent + "." + cur_level + ".png")
             icon_dir_path = os.path.join(self.__uiTreeDir, "icon\\" + cur_parent + "." + cur_level + ".dir.png")
-            opc_cfg = self.get_value_dict(cur_level, cur_parent)
+
+            if opc_cfg.__len__() == 0:
+                opc_cfg = self.get_value_dict(cur_level, cur_parent)
             self.warn(u"Option(%s)首配图片不存在,尝试使用次配图(%s):%s,配置%s" % (optionName, cur_parent, icon_path, opc_cfg))
             # 如果次配都不存在,使用顶层配图;
             if not os.path.exists(icon_path):
@@ -121,7 +129,8 @@ class COptionConfig(TConfig, CBaseLog):
                 # 使用顶层配图(first parent)
                 icon_path = os.path.join(self.__uiTreeDir, "icon\\" + first_parent + "." + cur_level + "_" + optionName + ".png")
                 icon_dir_path = os.path.join(self.__uiTreeDir, "icon\\" + first_parent + "." + cur_level + "_" + optionName + ".dir.png")
-                opc_cfg = self.get_value_dict(cur_level, first_parent + '.' + optionName)
+                if opc_cfg.__len__() == 0:
+                    opc_cfg = self.get_value_dict(cur_level, first_parent)
                 self.warn(u"Option(%s)次配图片不存在,尝试使用顶层配图(%s):%s,配置%s" % (optionName, first_parent, icon_path, opc_cfg))
                 # 如果顶层配图不存在,退出;
                 if not os.path.exists(icon_path):
@@ -202,7 +211,12 @@ class COptionConfig(TConfig, CBaseLog):
 
         return True, {"icon_path": icon_path, "dcfg": opc_cfg, "dir_path": icon_dir_path}
 
-    # 获取Option的图片配置;
+    '''
+    函数:获取Option的图片配置
+    参数:
+        optionName      要获取的option。
+    返回:Boolean, {}
+    '''
     def getOptionICONConfig(self, optionName):
         outResutl, outData = self.__getICONConfig1(optionName, False)
         if outResutl is False:
@@ -210,7 +224,12 @@ class COptionConfig(TConfig, CBaseLog):
 
         return outResutl, outData
 
-    # 获取Value的图片配置;
+    '''
+    函数:获取Value的图片配置
+    参数:
+        valueName      要获取的value名称。
+    返回:Boolean, {}
+    '''
     def getValueICONConfig(self, valueName):
         outResutl, outData = self.__getICONConfig1(valueName, True)
         if outResutl is False:
@@ -218,7 +237,12 @@ class COptionConfig(TConfig, CBaseLog):
 
         return outResutl, outData
 
-    # 获取Option的OCR配置;
+    '''
+    函数:获取Option的OCR配置
+    参数:
+        optionName      要获取的option名称
+    返回:字典
+    '''
     def getOptionOCRConfig(self, optionName):
         ocr_dict = []
         # 默认的ocr配置;
@@ -266,9 +290,15 @@ class COptionConfig(TConfig, CBaseLog):
 
         return ocr_dict
 
-    # 获取ICON源屏幕的分辨率配置值;
-    # 该值用途:由于有些icon是在某些分辨率下截图的,但是同机芯项目可能使用同一套UI,只是分辨率不一样而已。
-    # 所以,根据当初的icon分辨率,可以计算出在别的分辨率下的icon区域大小;
+    '''
+    函数:获取ICON源屏幕的分辨率配置值
+    参数:
+    返回:
+    
+    说明:
+    该值用途:由于有些icon是在某些分辨率下截图的,但是同机芯项目可能使用同一套UI,只是分辨率不一样而已。
+    所以,根据当初的icon分辨率,可以计算出在别的分辨率下的icon区域大小;
+    '''
     def getICONResolutionConfig(self):
         return self.get_value_dict('Screen', 'shape') if self.has_option('Screen', 'shape') else [1920, 1080]
 

+ 33 - 11
ssat_sdk/MenuTree3/logic.py

@@ -123,6 +123,7 @@ class CMenuLogic(CBaseLog):
     '''
 
     def checkOptionValue(self, optionName, optionValue):
+        self.info(u"【%s】【%s】" % (optionName, optionValue))
         CMenuLogic.sourceInput.setPattern(11)
         opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
 
@@ -132,6 +133,7 @@ class CMenuLogic(CBaseLog):
 
         # 首先,调用根菜单;
         opa.callFirstOptionShortCutKey()
+        time.sleep(1)
         if opa.isOnFirstOption() is False:
             self.error(u"未聚焦到根节点上,退出")
             return False
@@ -142,6 +144,7 @@ class CMenuLogic(CBaseLog):
                 return False
 
         # 到达目标option后,进入value表;
+        self.info(u"进入value表")
         opa.enterNode()
 
         # 遍历到value节点中;
@@ -150,19 +153,38 @@ class CMenuLogic(CBaseLog):
                 return False
 
         # 找到value节点,设置值;
+        self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
         opa.setOptionValue()
 
+        # 返回主页;
+        self.__back2Home(opa)
+
 
 if __name__ == "__main__":
     ml = CMenuLogic()
-    ml.setOptionValue('picture_preset', 'personal')
-    time.sleep(2)
-    ml.setOptionValue('picture_preset', 'dynamic')
-    time.sleep(2)
-    ml.setOptionValue('picture_preset', 'stadium')
-    time.sleep(2)
-    ml.setOptionValue('picture_preset', 'standard')
-    time.sleep(2)
-    ml.setOptionValue('picture_preset', 'natural')
-    time.sleep(2)
-    ml.setOptionValue('picture_preset', 'movie')
+    if 0:
+        ml.setOptionValue('picture_preset', 'personal')
+        time.sleep(2)
+        ml.setOptionValue('picture_preset', 'dynamic')
+        time.sleep(2)
+        ml.setOptionValue('picture_preset', 'stadium')
+        time.sleep(2)
+        ml.setOptionValue('picture_preset', 'standard')
+        time.sleep(2)
+        ml.setOptionValue('picture_preset', 'natural')
+        time.sleep(2)
+        ml.setOptionValue('picture_preset', 'movie')
+
+    if 1:
+        value = 33
+        ml.setOptionValue('backlight', value)
+        time.sleep(2)
+        ml.setOptionValue('brightness', value)
+        time.sleep(2)
+        ml.setOptionValue('contrast', value)
+        time.sleep(2)
+        ml.setOptionValue('saturation', value)
+        time.sleep(2)
+        ml.setOptionValue('tint', value)
+        time.sleep(2)
+        ml.setOptionValue('sharpness', value)