| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705 | 
							
- import time
 
- from BaseLog import CBaseLog
 
- from ExtraData import CExtraData
 
- from OptionExcel import COptionExcel
 
- from OptionConfig import COptionConfig
 
- from OptionAction import COptionAction
 
- from ssat_sdk.source_input import SourceGenInput
 
- from ssat_sdk.tv_detect import *
 
- from ssat_sdk.device_manage.capturecard_manager import CCardManager
 
- from ssat_sdk.utils.string_util import strcmp
 
- import random
 
- class CTMenu(CBaseLog):
 
-     sourceInput = SourceGenInput()
 
-     
 
-     redRat3 = TvOperator()
 
-     
 
-     captureCard = CCardManager()
 
-     
 
-     imgCMP = ImageCMP()
 
-     rgbColor = RGBColor()
 
-     CIE = CIEluvCaculator()
 
-     def __init__(self, ocrDict=None):
 
-         CBaseLog.__init__(self)
 
-         self.__exData = CExtraData()
 
-         self.__optionExcel = COptionExcel(self.__exData)
 
-         self.__optionConfig = COptionConfig(self.__exData, self.__optionExcel)
 
-         self.__curOpa = None
 
-         self.__lastOpa = None
 
-         self.__lastTime = None
 
-     @property
 
-     def exData(self):
 
-         return self.__exData
 
-     @property
 
-     def optionExcel(self):
 
-         return self.__optionExcel
 
-     @property
 
-     def optionConfig(self):
 
-         return self.__optionConfig
 
-     @property
 
-     def opa(self):
 
-         return self.__curOpa
 
-     @property
 
-     def pos(self):
 
-         return self.__curOpa.pos
 
-     def setOpa(self, opa):
 
-         self.__curOpa = opa
 
-     def setCurPos(self, pos):
 
-         self.__curOpa.setCurPos(pos)
 
-     def clearOpa(self):
 
-         self.__lastOpa = None
 
-         self.__curOpa = None
 
-     '''
 
-     函数:同步两个opa信息;
 
-     参数:
 
-     返回:
 
-     '''
 
-     def SyncOptionInfo(self):
 
-         
 
-         
 
-         
 
-         
 
-         if self.__lastOpa:
 
-             self.info(u"lastOpa.pos=%d" % self.__lastOpa.pos)
 
-             diffValue = self.__lastOpa.pos - self.__curOpa.getPathLength()
 
-             
 
-             if diffValue == 0:
 
-                 if self.__curOpa.isOptionInPaths(self.__lastOpa.pos, self.__lastOpa.optionValue) is True:
 
-                     self.__curOpa.setCurPos(self.__lastOpa.pos)
 
-             elif diffValue > 0:
 
-                 
 
-                 if self.__lastOpa.isOptionInPaths(self.__lastOpa.getPathLength(), self.__curOpa.curOptionName) is True:
 
-                     while diffValue > 0:
 
-                         diffValue -= 1
 
-                         self.__lastOpa.back2ParentNode()
 
-                     
 
-                     self.__curOpa.setCurPos(self.__curOpa.getPathLength())
 
-             elif diffValue < 0:
 
-                 
 
-                 if self.__curOpa.isOptionInPaths(self.__lastOpa.pos, self.__lastOpa.curOptionName) is True:
 
-                     self.__curOpa.setCurPos(self.__lastOpa.pos)
 
-         
 
-         
 
-         self.__lastOpa = self.__curOpa
 
-     def takePicture(self):
 
-         img = os.path.join(getSATTmpDIR(), "menutree_runpath.png")
 
-         self.captureCard.takePicture(img)
 
-         if not os.path.exists(img):
 
-             self.error(u"截图失败:%s" % img)
 
-         return img
 
-     '''
 
-     函数:判断两值(for_ocr与ocr识别结果)是否相等;
 
-     参数:
 
-         srcValue        源值,excel表格中读取的value值。
 
-         tagValue        目标值,ocr识别的结果值。
 
-     返回:相同返回True。
 
-     '''
 
-     def __isValueEqual(self, srcValue, tagValue):
 
-         self.info(u"源值=%s, 目标值=%s" % (str(srcValue), str(tagValue)))
 
-     '''
 
-     函数:移动到目标节点上(路径节点和value节点)
 
-     参数:
 
-         opa                 COptionAction对象;
 
-         moveDirection       移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
 
-         maxTry              最大移动次数,防止死循环。
 
-     返回:Boolean是否在目标节点上, 文本或数值。
 
-     '''
 
-     def __move2TargetNode(self, opa, moveDirection, maxTry=15):
 
-         tryCount = 0
 
-         
 
-         isOnTargetNode = False
 
-         
 
-         targetFocus = False
 
-         
 
-         targetText = None
 
-         
 
-         while True:
 
-             
 
-             targetFocus, targetText = opa.isOnTargetNode()
 
-             if targetFocus is True:
 
-                 
 
-                 if opa.isOnTargetOption() or opa.isOnValueSheet():
 
-                     self.info(u"<到达目标路径节点或value节点>")
 
-                     isOnTargetNode = True
 
-                     break
 
-                 
 
-                 self.info(u"<进入下一节点>")
 
-                 opa.enterNode()
 
-                 
 
-                 hasBox, dealStatus = opa.dealPasswordBox()
 
-                 if hasBox is True and dealStatus is False:
 
-                     break
 
-                 continue
 
-             
 
-             
 
-             if moveDirection:
 
-                 opa.move2NextSiblingNode()
 
-             else:
 
-                 opa.move2PrevSiblingNode()
 
-             tryCount += 1
 
-             if tryCount > maxTry:
 
-                 self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
 
-                 break
 
-         
 
-         return isOnTargetNode, targetText
 
-     def move2TargetNode(self, opa, moveDirection, maxTry=15):
 
-         return self.__move2TargetNode(opa, moveDirection, maxTry)
 
-     def back2Home(self):
 
-         return self.__back2Home(self.__curOpa)
 
-     '''
 
-     函数:退出 usb 信源界面;
 
-     参数:
 
-         opa     COptionAction对象;
 
-     返回:如果可以直接调用信源菜单返回True,否则返回False;
 
-     '''
 
-     def __exitUsbSource(self, opa):
 
-         
 
-         enterKey = opa.curOptionInfo['enter_key']
 
-         '''
 
-             现在测试要插上U盘测试,而插上U盘以后,USB信源下的聚焦框会干扰到信源列表的聚焦框识别;
 
-             因此注掉下面两段可能会干扰信源切换的代码,一旦进入USB信源,统一按exit键退出。
 
-         '''
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         
 
-         self.redRat3.sendKey("exit", duration=2)
 
-         
 
-         opa.callFirstOptionShortCutKey()
 
-         
 
-         if opa.isOnFirstOption() is True:
 
-             self.redRat3.sendKey("ok", duration=2)
 
-             return False
 
-         self.redRat3.sendKey("return", duration=2)
 
-         
 
-         opa.callFirstOptionShortCutKey()
 
-         
 
-         if opa.isOnFirstOption() is True:
 
-             self.redRat3.sendKey("ok", duration=2)
 
-             return False
 
-     '''
 
-     函数:移动到目标信源节点上。
 
-     参数:
 
-         opa                 COptionAction对象;
 
-         moveDirection       移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
 
-         maxTry              最大移动次数,防止死循环。
 
-     返回:Boolean是否在目标节点上, 文本或数值。
 
-     '''
 
-     def __move2SourceNode(self, opa, moveDirection, maxTry=15):
 
-         tryCount = 0
 
-         
 
-         targetFocus = False
 
-         
 
-         targetText = None
 
-         self.info(u"===========maxTry=%d" % maxTry)
 
-         
 
-         while True:
 
-             
 
-             pic = self.takePicture()
 
-             
 
-             enterKey = opa.curOptionInfo['enter_key']
 
-             if enterKey != "default":
 
-                 opa.executeKey(enterKey)
 
-             
 
-             targetFocus, targetText = opa.isOnTargetNode(pic)
 
-             if targetFocus is True:
 
-                 self.info(u"===========到达目标信源节点===========")
 
-                 break
 
-             
 
-             
 
-             if targetText and 'usb' in targetText.lower():
 
-                 if not self.__exitUsbSource(opa):
 
-                     self.info(u"///////////////////////退出USB成功。///////////////////////")
 
-                     
 
-                     opa.callFirstOptionShortCutKey()
 
-                     
 
-                     opa.move2NextSiblingNode() if moveDirection else opa.move2PrevSiblingNode()
 
-                     opa.move2NextSiblingNode() if moveDirection else opa.move2PrevSiblingNode()
 
-                     opa.executeKey(enterKey)
 
-                     
 
-                     opa.callFirstOptionShortCutKey()
 
-                     continue
 
-             
 
-             opa.callFirstOptionShortCutKey()
 
-             
 
-             opa.move2NextSiblingNode() if moveDirection else opa.move2PrevSiblingNode()
 
-             tryCount += 1
 
-             if tryCount > maxTry:
 
-                 self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
 
-                 break
 
-         
 
-         return targetFocus, targetText
 
-     '''
 
-     函数:聚焦到指定option中。
 
-     参数:
 
-         opa         COptionAction对象。
 
-     返回:Boolean,成功返回True.
 
-     '''
 
-     def __focusOption(self, opa):
 
-         
 
-         if opa.checkRunOptionPath() is False:
 
-             self.__back2Home(opa)
 
-             return False
 
-         
 
-         if self.__curOpa.pos == 0:
 
-             
 
-             opa.callFirstOptionShortCutKey()
 
-             
 
-             if opa.isOnFirstOption() is False:
 
-                 self.error(u"未聚焦到根节点上,退出")
 
-                 self.__back2Home(opa)
 
-                 return False
 
-         
 
-         if self.__move2TargetNode(opa, True)[0] is False:
 
-             if self.__move2TargetNode(opa, False)[0] is False:
 
-                 self.__back2Home(opa)
 
-                 return False
 
-         return True
 
-     '''
 
-     函数:进入到指定的option中。
 
-     参数:
 
-         opa         COptionAction对象。
 
-     返回:Boolean,成功返回True.
 
-     '''
 
-     def __openOption(self, opa):
 
-         if self.__focusOption(opa) is False:
 
-             return False
 
-         
 
-         self.info(u"进入option")
 
-         opa.enterNode()
 
-         
 
-         hasBox, dealStatus = opa.dealPasswordBox()
 
-         if hasBox is True and dealStatus is False:
 
-             self.error(u"密码框处理失败")
 
-             return False
 
-         return True
 
-     '''
 
-     函数:返回到主页(不一定就是Home页,一般指返回运行前的那个画面)
 
-     参数:
 
-         opa         COptionAction对象;
 
-     返回:
 
-     
 
-     '''
 
-     def __back2Home(self, opa):
 
-         self.info(u"返回主页")
 
-         while opa.pos > 0:
 
-             opa.back2ParentNode()
 
-         self.info(u"【如果设置value时,会自动回退到上一层父节点,此处操作正常。否则要多返回一层。】")
 
-         
 
-         
 
-         self.redRat3.sendKey("return", 1, 1)
 
-     '''
 
-     函数:设置指定的option的值为optionValue。
 
-     参数:
 
-         optionName      要设置的option;
 
-         optionValue     option要设置的值;
 
-     返回: Boolean。
 
-     '''
 
-     def setOptionValue(self, optionName, optionValue):
 
-         self.info(u"【%s】【%s】" % (optionName, optionValue))
 
-         CTMenu.sourceInput.setPattern(11)
 
-         self.__curOpa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
 
-         
 
-         optionValueInfo = self.__optionExcel.getOptionValueInfo(optionName, optionValue)
 
-         if optionValueInfo == []:
 
-             self.error(u"当前optionName:[%s],optionValue:[%s],读取相关参数异常!!!请检查带入参数或者MenuTree配置的有效性!!!"%(optionName, optionValue))
 
-             return False
 
-         
 
-         if self.__openOption(self.__curOpa) is False:
 
-             return False
 
-         
 
-         if self.__move2TargetNode(self.__curOpa, True)[0] is False:
 
-             if self.__move2TargetNode(self.__curOpa, False)[0] is False:
 
-                 self.__back2Home(self.__curOpa)
 
-                 return False
 
-         
 
-         self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
 
-         self.__curOpa.setOptionValue()
 
-         
 
-         self.__back2Home(self.__curOpa)
 
-         return True
 
-     '''
 
-     函数:移动到目标option后,读取该option的value值,与optionValue进行比较,相等表示检测值与目标值一致;
 
-     参数:
 
-         optionName      要设置的option;
 
-         optionValue     option要设置的值;
 
-     返回: Boolean。
 
-     '''
 
-     def checkOptionValue(self, optionName, optionValue):
 
-         self.info(u"【%s】【%s】" % (optionName, optionValue))
 
-         CTMenu.sourceInput.setPattern(11)
 
-         self.__curOpa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
 
-         
 
-         if self.__openOption(self.__curOpa) is False:
 
-             return False
 
-         isValueEqual = False
 
-         
 
-         valueFocus, valueText = self.__curOpa.isOnTargetNode()
 
-         self.info(u"===当前捕获的文本内容=%s,目标文本=%s,状态:%d===" % (str(valueText), str(optionValue), valueFocus))
 
-         
 
-         if type(optionValue) == int or type(optionValue) == float:
 
-             isValueEqual = True if float(optionValue) == float(valueText) else False
 
-         else:
 
-             isValueEqual = valueFocus
 
-         
 
-         self.__back2Home(self.__curOpa)
 
-         
 
-         self.info(
 
-             u"checkOptionValue结果:optionValue=%s, ocrValue=%s, 结果=%d" % (str(optionValue), str(valueText), isValueEqual))
 
-         return isValueEqual
 
-     '''
 
-     函数:进入指定的option,并且不返回主页。
 
-     参数:
 
-         optionName          指定要进入的option节点。
 
-         fromFirst           是否从第一层开始执行。默认从第一层执行,如果传入False,则以上一次执行所在层级来执行。
 
-     返回:Boolean。成功进入返回True.
 
-     '''
 
-     def openOption(self, optionName, fromFirst = True):
 
-         self.info(u"【%s】" % optionName)
 
-         CTMenu.sourceInput.setPattern(11)
 
-         self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
 
-         if not fromFirst:
 
-             
 
-             self.SyncOptionInfo()
 
-         if self.__openOption(self.__curOpa) is False:
 
-             return False
 
-         
 
-         self.info(u"成功open指定option=%s" % optionName)
 
-         return True
 
-     '''
 
-     函数:设置self.__curOpa的值;
 
-     参数:
 
-     返回:
 
-     注意:一般在使用了openOption后,才调用该函数.且该函数不返回(不调用back2Home);
 
-     '''
 
-     def setValue(self, optionValue):
 
-         self.info(u"开始设置值:optionName=%s, optionValue=%s" % (self.__curOpa.curOptionName, str(optionValue)))
 
-         if self.__curOpa.setValue(optionValue) is False:
 
-             self.info(u"该value[%s]不存在" % optionValue)
 
-             return False
 
-         
 
-         if self.__move2TargetNode(self.__curOpa, True)[0] is False:
 
-             if self.__move2TargetNode(self.__curOpa, False)[0] is False:
 
-                 self.__back2Home(self.__curOpa)
 
-                 return False
 
-         
 
-         self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
 
-         self.__curOpa.setOptionValue()
 
-         return True
 
-     '''
 
-     函数:聚焦到指定option的value上,不设置不打开不返回。
 
-     参数:
 
-         optionName
 
-         optionValue
 
-     返回:
 
-     
 
-     注意:如果optionValue是数值类型,将不会变更值。
 
-           如optionValue=10,实现该optionName的value是100,则不变更其值。
 
-     '''
 
-     def focusOptionValue(self, optionName, optionValue):
 
-         self.info(u"【%s】【%s】" % (optionName, optionValue))
 
-         CTMenu.sourceInput.setPattern(11)
 
-         self.__curOpa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
 
-         
 
-         if self.__openOption(self.__curOpa) is False:
 
-             return False
 
-         
 
-         if self.__move2TargetNode(self.__curOpa, True)[0] is False:
 
-             if self.__move2TargetNode(self.__curOpa, False)[0] is False:
 
-                 self.__back2Home(self.__curOpa)
 
-                 return False
 
-         return True
 
-     '''
 
-     函数:获取当前option节点的value值。
 
-     参数:
 
-         optionName      要获取值的option;
 
-     返回:Boolean, str/int/float
 
-     '''
 
-     def getOptionValue(self, optionName):
 
-         self.info(u"【%s】" % optionName)
 
-         CTMenu.sourceInput.setPattern(11)
 
-         self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
 
-         
 
-         if self.__openOption(self.__curOpa) is False:
 
-             return False, None
 
-         
 
-         valueFocus, valueText = self.__curOpa.isOnTargetNode()
 
-         self.info(u"===当前捕获的文本内容=%s,聚焦状态:%d===" % (str(valueText), valueFocus))
 
-         
 
-         self.__back2Home(self.__curOpa)
 
-         return valueFocus, valueText
 
-     '''
 
-     函数:
 
-     参数:
 
-     返回:
 
-     '''
 
-     def focusOption(self, optionName):
 
-         self.info(u"【%s】" % optionName)
 
-         CTMenu.sourceInput.setPattern(11)
 
-         self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
 
-         return self.__focusOption(self.__curOpa)
 
-     '''
 
-     函数:
 
-     参数:
 
-     返回:
 
-     '''
 
-     def inputUnlock(self, stdText, password=''):
 
-         self.__curOpa = COptionAction(None, None, self.__optionConfig, self.__optionExcel)
 
-         return self.__curOpa.inputUnlock(stdText, password)
 
-     '''
 
-     函数:当焦点已经在option层级上时,移动到指定的option上。
 
-     参数:
 
-         optionName      目标option.
 
-     返回:Boolean,成功移动到目标节点返回True。
 
-     
 
-     注意:该函数不是从根节点开始移动到目标节点,而是假定焦点已经在目标节点层级菜单上。
 
-     '''
 
-     def moveToOption(self, optionName):
 
-         self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
 
-         
 
-         self.__curOpa.setCurPos(self.__curOpa.getPathLength() - 1)
 
-         
 
-         if self.__curOpa.checkRunOptionPath() is False:
 
-             self.__back2Home(self.__curOpa)
 
-             return False
 
-         
 
-         if self.__move2TargetNode(self.__curOpa, True)[0] is False:
 
-             if self.__move2TargetNode(self.__curOpa, False)[0] is False:
 
-                 self.__back2Home(self.__curOpa)
 
-                 return False
 
-         self.info(u"已移动到目标节点[%s]" % optionName)
 
-         return True
 
-     '''
 
-     函数:检测输入的频道列表,是否都存在,返回不存在的频道列表。
 
-     参数:
 
-         channelList         要检测的目标频道列表。
 
-     返回:Boolean, []
 
-         如果有频道没找到,返回False,并返回没找到的频道列表。如果全部找到返回True。
 
-     '''
 
-     def checkChannelList(self, channelList, maxTry=15):
 
-         failChannelList = []
 
-         checkResult = True
 
-         if not channelList:
 
-             self.error(u"传入的待检测的频道列表为空!")
 
-             return False, failChannelList
 
-         for channel in channelList:
 
-             
 
-             opa = COptionAction(channel, None, self.__optionConfig, self.__optionExcel)
 
-             
 
-             if opa.checkRunOptionPath() is False:
 
-                 self.error(u"频道:%s读取失败!!!请检查MenuTree配置!!!"%str(channel))
 
-                 failChannelList.append(channel)
 
-                 checkResult = False
 
-                 continue
 
-             self.__curOpa = opa
 
-             isSearched = self.__focusOption(opa)
 
-             if not isSearched:
 
-                 self.warn(u"频道:%s查找失败!" % str(channel))
 
-                 failChannelList.append(channel)
 
-                 checkResult = False
 
-                 
 
-                 
 
-                 self.redRat3.sendKey("exit")
 
-             else:
 
-                 self.info(u"频道:%s查找成功!" % str(channel))
 
-             self.redRat3.sendKey("exit")
 
-         self.info(u"频道列表检测结果checkResult:%s,检测失败频道列表failChannelLis:%s" % (str(checkResult), str(failChannelList)))
 
-         return checkResult, failChannelList
 
-     '''
 
-     函数:移动到黑屏的频道。
 
-     参数:
 
-         channelCount           要查找多少次频道。
 
-         blackThreshold         黑屏阈值。
 
-         blackRate              黑屏比率。
 
-     返回:Boolean。找到返回True。
 
-     '''
 
-     def getBlackChannel(self, channelCount, blackThreshold=20, blackRate=0.8):
 
-         result = False
 
-         
 
-         for i in range(0, channelCount):
 
-             
 
-             pic_path = self.takePicture()
 
-             img = cv.imread(pic_path)
 
-             pic_path2 = os.path.join(getSATTmpDIR(), "menutree_focus_area_half.png")
 
-             self.imgCMP.saveCropPic(pic_path, pic_path2, (0, 0, img.shape[1] / 2, img.shape[0]))
 
-             
 
-             result = self.imgCMP.isBlack(pic_path2, blackThreshold, 10, 1 - blackRate)
 
-             if result is True:
 
-                 break
 
-             
 
-             self.redRat3.sendKey('C+')
 
-             time.sleep(4)
 
-         
 
-         return result
 
-     '''
 
-     函数:设置信源。
 
-     参数:
 
-         optionName      目标信源;
 
-     返回:
 
-     
 
-     注意:切换信源是特殊的情况处理:
 
-         1、信源菜单消失过快,会导致ocr识别完成后,菜单已消失。
 
-         2、usb信源下,可能会调用source按键失败,所以需要调用其他退出键(ok、exit、return)
 
-     '''
 
-     def setSourceValue(self, optionParent, optionName):
 
-         self.info(u"【%s】" % optionName)
 
-         CTMenu.sourceInput.setPattern(11)
 
-         sourceList = self.__optionExcel.getOptionAllSiblingItemTextList1d(optionName)
 
-         self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
 
-         
 
-         if not self.__curOpa.checkRunOptionPath():
 
-             return False
 
-         
 
-         self.__curOpa.callFirstOptionShortCutKey()
 
-         
 
-         if self.__move2SourceNode(self.__curOpa, True, sourceList.__len__() * 2)[0] is False:
 
-             if self.__move2SourceNode(self.__curOpa, False, sourceList.__len__() * 2)[0] is False:
 
-                 self.__back2Home(self.__curOpa)
 
-                 return False
 
-         self.info(u"成功进入指定信源:%s" % optionName)
 
-         return True
 
-     '''
 
-     函数:识别传入的option / optionValue,是否在当前页面中存在
 
-     参数:
 
-         option:在value不传入的情况下,option为非value层的option名;
 
-         value:传入的情况下,option为value层的value_name,value则为value名
 
-     返回:
 
-         boolean,是否识别到该option / optionValue
 
-     '''
 
-     def checkOptionExist(self, option, value=None):
 
-         self.__curOpa = COptionAction(option, value, self.optionConfig, self.optionExcel)
 
-         self.__curOpa.setCurPos(self.__curOpa.getPathLength())
 
-         return self.__curOpa.isOnTargetNode()[0]
 
-     '''
 
-         调用当前opa的back2ParentNode()
 
-     '''
 
-     def back2parentNode(self):
 
-         return self.__curOpa.back2ParentNode()
 
- if __name__ == "__main__":
 
-     ml = CTMenu()
 
-     ml.openOption("picture_preset")
 
 
  |