TMenu.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. # -*- coding:utf-8 -*-
  2. import os, time
  3. from BaseLog import CBaseLog
  4. from ExtraData import CExtraData
  5. from OptionExcel import COptionExcel
  6. from OptionConfig import COptionConfig
  7. from OptionFocus import COptionFocus
  8. from OptionOCR import COptionOCR
  9. from OptionAction import COptionAction
  10. from ssat_sdk.source_input import SourceGenInput
  11. # 测试使用到
  12. import random
  13. class CTMenu(CBaseLog):
  14. sourceInput = SourceGenInput()
  15. def __init__(self, ocrDict=None):
  16. CBaseLog.__init__(self)
  17. self.__exData = CExtraData()
  18. self.__optionExcel = COptionExcel(self.__exData)
  19. self.__optionConfig = COptionConfig(self.__exData, self.__optionExcel)
  20. '''
  21. 函数:判断两值(for_ocr与ocr识别结果)是否相等;
  22. 参数:
  23. srcValue 源值,excel表格中读取的value值。
  24. tagValue 目标值,ocr识别的结果值。
  25. 返回:相同返回True。
  26. '''
  27. def __isValueEqual(self, srcValue, tagValue):
  28. self.info(u"源值=%s, 目标值=%s" % (str(srcValue), str(tagValue)))
  29. '''
  30. 函数:移动到目标节点上(路径节点和value节点)
  31. 参数:
  32. opa COptionAction对象;
  33. moveDirection 移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
  34. maxTry 最大移动次数,防止死循环。
  35. 返回:Boolean是否在目标节点上, 文本或数值。
  36. '''
  37. def __move2TargetNode(self, opa, moveDirection, maxTry=15):
  38. tryCount = 0
  39. # 是否到目标结点了;
  40. isOnTargetNode = False
  41. # 目标节点聚焦状态;
  42. targetFocus = False
  43. # 目标文本或数值;
  44. targetText = None
  45. # 移动到目标节点;
  46. while True:
  47. # 判断是否移动成功;
  48. targetFocus, targetText = opa.isOnTargetNode()
  49. if targetFocus is True:
  50. # 如果已在目标结点,退出循环;
  51. if opa.isOnTargetOption() or opa.isOnValueSheet():
  52. self.info(u"<到达目标路径节点或value节点>")
  53. isOnTargetNode = True
  54. break
  55. # 未到目标,进入下一节点;
  56. self.info(u"<进入下一节点>")
  57. opa.enterNode()
  58. continue
  59. # endif
  60. # 移动到下/上一节点;
  61. if moveDirection:
  62. opa.move2NextSiblingNode()
  63. else:
  64. opa.move2PrevSiblingNode()
  65. tryCount += 1
  66. if tryCount > maxTry:
  67. self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
  68. break
  69. # end-while
  70. return isOnTargetNode, targetText
  71. '''
  72. 函数:聚焦到指定option中。
  73. 参数:
  74. opa COptionAction对象。
  75. 返回:Boolean,成功返回True.
  76. '''
  77. def __focusOption(self, opa):
  78. # 检测路径是否有效;
  79. if opa.checkRunOptionPath() is False:
  80. self.__back2Home(opa)
  81. return False
  82. # 首先,调用根菜单;
  83. opa.callFirstOptionShortCutKey()
  84. time.sleep(1)
  85. if opa.isOnFirstOption() is False:
  86. self.error(u"未聚焦到根节点上,退出")
  87. self.__back2Home(opa)
  88. return False
  89. # 遍历到目标option中;
  90. if self.__move2TargetNode(opa, True)[0] is False:
  91. if self.__move2TargetNode(opa, False)[0] is False:
  92. self.__back2Home(opa)
  93. return False
  94. return True
  95. '''
  96. 函数:进入到指定的option中。
  97. 参数:
  98. opa COptionAction对象。
  99. 返回:Boolean,成功返回True.
  100. '''
  101. def __openOption(self, opa):
  102. if self.__focusOption(opa) is False:
  103. return False
  104. # 到达目标option后;
  105. self.info(u"进入option")
  106. opa.enterNode()
  107. return True
  108. '''
  109. 函数:返回到主页(不一定就是Home页,一般指返回运行前的那个画面)
  110. 参数:
  111. opa COptionAction对象;
  112. 返回:
  113. '''
  114. def __back2Home(self, opa):
  115. self.info(u"返回主页")
  116. while opa.pos > 0:
  117. opa.back2ParentNode()
  118. self.info(u"【如果设置value时,会自动回退到上一层父节点,此处操作正常。否则要多返回一层。】")
  119. '''
  120. 函数:设置指定的option的值为optionValue。
  121. 参数:
  122. optionName 要设置的option;
  123. optionValue option要设置的值;
  124. 返回: Boolean。
  125. '''
  126. def setOptionValue(self, optionName, optionValue):
  127. self.info(u"【%s】【%s】" % (optionName, optionValue))
  128. CTMenu.sourceInput.setPattern(11)
  129. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  130. # 检测路径是否有效;
  131. if self.__openOption(opa) is False:
  132. return False
  133. # 遍历到value节点中;
  134. if self.__move2TargetNode(opa, True)[0] is False:
  135. if self.__move2TargetNode(opa, False)[0] is False:
  136. self.__back2Home(opa)
  137. return False
  138. # 找到value节点,设置值;
  139. self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
  140. opa.setOptionValue()
  141. # 返回主页;
  142. self.__back2Home(opa)
  143. '''
  144. 函数:移动到目标option后,读取该option的value值,与optionValue进行比较,相等表示检测值与目标值一致;
  145. 参数:
  146. optionName 要设置的option;
  147. optionValue option要设置的值;
  148. 返回: Boolean。
  149. '''
  150. def checkOptionValue(self, optionName, optionValue):
  151. self.info(u"【%s】【%s】" % (optionName, optionValue))
  152. CTMenu.sourceInput.setPattern(11)
  153. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  154. # 进入节点;
  155. if self.__openOption(opa) is False:
  156. return False
  157. isValueEqual = False
  158. # 获取value节点值;
  159. valueFocus, valueText = opa.isOnTargetNode()
  160. self.info(u"===当前捕获的文本内容=%s,目标文本=%s,状态:%d===" % (str(valueText), str(optionValue), valueFocus))
  161. # 如果是数值,则判断获取的值是否相等;否则,只判断是否聚焦.
  162. if type(optionValue) == int or type(optionValue) == float:
  163. isValueEqual = True if float(optionValue) == float(valueText) else False
  164. else:
  165. isValueEqual = valueFocus
  166. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  167. opa.back2ParentNode(False)
  168. # 返回主页;
  169. self.__back2Home(opa)
  170. # 聚焦状态就是结果;
  171. self.info(u"checkOptionValue结果:optionValue=%s, ocrValue=%s, 结果=%d" % (str(optionValue), str(valueText), isValueEqual))
  172. return isValueEqual
  173. '''
  174. 函数:进入指定的option,并且不返回主页。
  175. 参数:
  176. optionName 指定要进入的option节点。
  177. 返回:Boolean。成功进入返回True.
  178. '''
  179. def openOption(self, optionName):
  180. self.info(u"【%s】" % optionName)
  181. CTMenu.sourceInput.setPattern(11)
  182. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  183. if self.__focusOption(opa) is False:
  184. return False
  185. # 到达目标option后;
  186. self.info(u"进入option")
  187. opa.enterNode()
  188. # 聚焦状态就是结果;
  189. self.info(u"成功open指定option" % optionName)
  190. return True
  191. '''
  192. 函数:聚焦到指定option的value上,不设置不打开不返回。
  193. 参数:
  194. optionName
  195. optionValue
  196. 返回:
  197. '''
  198. def focusOptionValue(self, optionName, optionValue):
  199. self.info(u"【%s】【%s】" % (optionName, optionValue))
  200. CTMenu.sourceInput.setPattern(11)
  201. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  202. # 进入节点;
  203. if self.__openOption(opa) is False:
  204. return False
  205. # 遍历到value节点中;
  206. if self.__move2TargetNode(opa, True)[0] is False:
  207. if self.__move2TargetNode(opa, False)[0] is False:
  208. self.__back2Home(opa)
  209. return False
  210. return True
  211. '''
  212. 函数:获取当前option节点的value值。
  213. 参数:
  214. optionName 要获取值的option;
  215. 返回:Boolean, str/int/float
  216. '''
  217. def getOptionValue(self, optionName):
  218. self.info(u"【%s】" % optionName)
  219. CTMenu.sourceInput.setPattern(11)
  220. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  221. # 检测路径是否有效;
  222. if self.__openOption(opa) is False:
  223. return False
  224. # 获取value节点值;
  225. valueFocus, valueText = opa.isOnTargetNode()
  226. self.info(u"===当前捕获的文本内容=%s,状态:%d===" % (str(valueText), valueFocus))
  227. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  228. opa.back2ParentNode(False)
  229. # 返回主页;
  230. self.__back2Home(opa)
  231. return valueFocus, valueText
  232. '''
  233. 函数:
  234. 参数:
  235. 返回:
  236. '''
  237. def focusOption(self, optionName):
  238. self.info(u"【%s】" % optionName)
  239. CTMenu.sourceInput.setPattern(11)
  240. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  241. return self.__focusOption(opa)
  242. if __name__ == "__main__":
  243. ml = CTMenu()
  244. if 0:
  245. st = 2
  246. ml.setOptionValue('picture_preset', 'personal')
  247. time.sleep(st)
  248. ml.setOptionValue('picture_preset', 'dynamic')
  249. time.sleep(st)
  250. ml.setOptionValue('picture_preset', 'stadium')
  251. time.sleep(st)
  252. ml.setOptionValue('picture_preset', 'standard')
  253. time.sleep(st)
  254. ml.setOptionValue('picture_preset', 'natural')
  255. time.sleep(st)
  256. ml.setOptionValue('picture_preset', 'movie')
  257. if 0:
  258. st = 2
  259. value = random.randint(0, 100)
  260. ml.setOptionValue('backlight', value)
  261. time.sleep(st)
  262. ml.checkOptionValue('backlight', value + 10)
  263. time.sleep(st)
  264. ml.checkOptionValue('backlight', value)
  265. time.sleep(st)
  266. ml.checkOptionValue('backlight', value+20)
  267. # time.sleep(st)
  268. # ml.setOptionValue('brightness', value)
  269. # time.sleep(st)
  270. # ml.setOptionValue('contrast', value)
  271. # time.sleep(st)
  272. # ml.setOptionValue('saturation', value)
  273. # time.sleep(st)
  274. # ml.setOptionValue('tint', value)
  275. # time.sleep(st)
  276. # ml.setOptionValue('sharpness', value)
  277. if 0:
  278. st = 10
  279. ml.setOptionValue('picture_preset', 'stadium')
  280. time.sleep(st)
  281. print "personal", ml.checkOptionValue('picture_preset', 'personal')
  282. time.sleep(st)
  283. print "dynamic", ml.checkOptionValue('picture_preset', 'dynamic')
  284. time.sleep(st)
  285. print "stadium", ml.checkOptionValue('picture_preset', 'stadium')
  286. time.sleep(st)
  287. print "standard", ml.checkOptionValue('picture_preset', 'standard')
  288. time.sleep(st)
  289. print "natural", ml.checkOptionValue('picture_preset', 'natural')
  290. time.sleep(st)
  291. print "movie", ml.checkOptionValue('picture_preset', 'movie')
  292. if 1:
  293. st = 30
  294. ml.focusOptionValue('picture_preset', 'personal')
  295. time.sleep(st)
  296. ml.focusOptionValue('picture_preset', 'dynamic')
  297. time.sleep(st)
  298. ml.focusOptionValue('picture_preset', 'stadium')
  299. time.sleep(st)
  300. ml.focusOptionValue('picture_preset', 'standard')
  301. time.sleep(st)
  302. ml.focusOptionValue('picture_preset', 'natural')
  303. time.sleep(st)
  304. ml.focusOptionValue('picture_preset', 'movie')