TMenu.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. # -*- coding:utf-8 -*-
  2. import time
  3. from BaseLog import CBaseLog
  4. from ExtraData import CExtraData
  5. from OptionExcel import COptionExcel
  6. from OptionConfig import COptionConfig
  7. from OptionAction import COptionAction
  8. from ssat_sdk.source_input import SourceGenInput
  9. # 测试使用到
  10. import random
  11. class CTMenu(CBaseLog):
  12. sourceInput = SourceGenInput()
  13. def __init__(self, ocrDict=None):
  14. CBaseLog.__init__(self)
  15. self.__exData = CExtraData()
  16. self.__optionExcel = COptionExcel(self.__exData)
  17. self.__optionConfig = COptionConfig(self.__exData, self.__optionExcel)
  18. @property
  19. def optionExcel(self):
  20. return self.__optionExcel
  21. @property
  22. def optionConfig(self):
  23. return self.__optionConfig
  24. '''
  25. 函数:判断两值(for_ocr与ocr识别结果)是否相等;
  26. 参数:
  27. srcValue 源值,excel表格中读取的value值。
  28. tagValue 目标值,ocr识别的结果值。
  29. 返回:相同返回True。
  30. '''
  31. def __isValueEqual(self, srcValue, tagValue):
  32. self.info(u"源值=%s, 目标值=%s" % (str(srcValue), str(tagValue)))
  33. '''
  34. 函数:移动到目标节点上(路径节点和value节点)
  35. 参数:
  36. opa COptionAction对象;
  37. moveDirection 移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
  38. maxTry 最大移动次数,防止死循环。
  39. 返回:Boolean是否在目标节点上, 文本或数值。
  40. '''
  41. def __move2TargetNode(self, opa, moveDirection, maxTry=15):
  42. tryCount = 0
  43. # 是否到目标结点了;
  44. isOnTargetNode = False
  45. # 目标节点聚焦状态;
  46. targetFocus = False
  47. # 目标文本或数值;
  48. targetText = None
  49. # 移动到目标节点;
  50. while True:
  51. # 判断是否移动成功;
  52. targetFocus, targetText = opa.isOnTargetNode()
  53. if targetFocus is True:
  54. # 如果已在目标结点,退出循环;
  55. if opa.isOnTargetOption() or opa.isOnValueSheet():
  56. self.info(u"<到达目标路径节点或value节点>")
  57. isOnTargetNode = True
  58. break
  59. # 先处理密码框;
  60. hasBox, dealStatus = opa.dealPasswordBox()
  61. if hasBox is True and dealStatus is False:
  62. break
  63. # 未到目标,进入下一节点;
  64. self.info(u"<进入下一节点>")
  65. opa.enterNode()
  66. continue
  67. # endif
  68. # 移动到下/上一节点;
  69. if moveDirection:
  70. opa.move2NextSiblingNode()
  71. else:
  72. opa.move2PrevSiblingNode()
  73. tryCount += 1
  74. if tryCount > maxTry:
  75. self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
  76. break
  77. # end-while
  78. return isOnTargetNode, targetText
  79. '''
  80. 函数:聚焦到指定option中。
  81. 参数:
  82. opa COptionAction对象。
  83. 返回:Boolean,成功返回True.
  84. '''
  85. def __focusOption(self, opa):
  86. # 检测路径是否有效;
  87. if opa.checkRunOptionPath() is False:
  88. self.__back2Home(opa)
  89. return False
  90. # 首先,调用根菜单;
  91. opa.callFirstOptionShortCutKey()
  92. time.sleep(1)
  93. if opa.isOnFirstOption() is False:
  94. self.error(u"未聚焦到根节点上,退出")
  95. self.__back2Home(opa)
  96. return False
  97. # 遍历到目标option中;
  98. if self.__move2TargetNode(opa, True)[0] is False:
  99. if self.__move2TargetNode(opa, False)[0] is False:
  100. self.__back2Home(opa)
  101. return False
  102. return True
  103. '''
  104. 函数:进入到指定的option中。
  105. 参数:
  106. opa COptionAction对象。
  107. 返回:Boolean,成功返回True.
  108. '''
  109. def __openOption(self, opa):
  110. if self.__focusOption(opa) is False:
  111. return False
  112. # 先处理密码框;
  113. hasBox, dealStatus = opa.dealPasswordBox()
  114. if hasBox is True and dealStatus is False:
  115. self.error(u"密码框处理失败")
  116. return False
  117. # 到达目标option后;
  118. self.info(u"进入option")
  119. opa.enterNode()
  120. return True
  121. '''
  122. 函数:返回到主页(不一定就是Home页,一般指返回运行前的那个画面)
  123. 参数:
  124. opa COptionAction对象;
  125. 返回:
  126. '''
  127. def __back2Home(self, opa):
  128. self.info(u"返回主页")
  129. while opa.pos > 0:
  130. opa.back2ParentNode()
  131. self.info(u"【如果设置value时,会自动回退到上一层父节点,此处操作正常。否则要多返回一层。】")
  132. '''
  133. 函数:设置指定的option的值为optionValue。
  134. 参数:
  135. optionName 要设置的option;
  136. optionValue option要设置的值;
  137. 返回: Boolean。
  138. '''
  139. def setOptionValue(self, optionName, optionValue):
  140. self.info(u"【%s】【%s】" % (optionName, optionValue))
  141. CTMenu.sourceInput.setPattern(11)
  142. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  143. # 检测路径是否有效;
  144. if self.__openOption(opa) is False:
  145. return False
  146. # 遍历到value节点中;
  147. if self.__move2TargetNode(opa, True)[0] is False:
  148. if self.__move2TargetNode(opa, False)[0] is False:
  149. self.__back2Home(opa)
  150. return False
  151. # 找到value节点,设置值;
  152. self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
  153. opa.setOptionValue()
  154. # 返回主页;
  155. self.__back2Home(opa)
  156. '''
  157. 函数:移动到目标option后,读取该option的value值,与optionValue进行比较,相等表示检测值与目标值一致;
  158. 参数:
  159. optionName 要设置的option;
  160. optionValue option要设置的值;
  161. 返回: Boolean。
  162. '''
  163. def checkOptionValue(self, optionName, optionValue):
  164. self.info(u"【%s】【%s】" % (optionName, optionValue))
  165. CTMenu.sourceInput.setPattern(11)
  166. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  167. # 进入节点;
  168. if self.__openOption(opa) is False:
  169. return False
  170. isValueEqual = False
  171. # 获取value节点值;
  172. valueFocus, valueText = opa.isOnTargetNode()
  173. self.info(u"===当前捕获的文本内容=%s,目标文本=%s,状态:%d===" % (str(valueText), str(optionValue), valueFocus))
  174. # 如果是数值,则判断获取的值是否相等;否则,只判断是否聚焦.
  175. if type(optionValue) == int or type(optionValue) == float:
  176. isValueEqual = True if float(optionValue) == float(valueText) else False
  177. else:
  178. isValueEqual = valueFocus
  179. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  180. opa.back2ParentNode(False)
  181. # 返回主页;
  182. self.__back2Home(opa)
  183. # 聚焦状态就是结果;
  184. self.info(u"checkOptionValue结果:optionValue=%s, ocrValue=%s, 结果=%d" % (str(optionValue), str(valueText), isValueEqual))
  185. return isValueEqual
  186. '''
  187. 函数:进入指定的option,并且不返回主页。
  188. 参数:
  189. optionName 指定要进入的option节点。
  190. 返回:Boolean。成功进入返回True.
  191. '''
  192. def openOption(self, optionName):
  193. self.info(u"【%s】" % optionName)
  194. CTMenu.sourceInput.setPattern(11)
  195. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  196. if self.__openOption(opa) is False:
  197. return False
  198. # 聚焦状态就是结果;
  199. self.info(u"成功open指定option=%s" % optionName)
  200. return True
  201. '''
  202. 函数:聚焦到指定option的value上,不设置不打开不返回。
  203. 参数:
  204. optionName
  205. optionValue
  206. 返回:
  207. '''
  208. def focusOptionValue(self, optionName, optionValue):
  209. self.info(u"【%s】【%s】" % (optionName, optionValue))
  210. CTMenu.sourceInput.setPattern(11)
  211. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  212. # 进入节点;
  213. if self.__openOption(opa) is False:
  214. return False
  215. # 遍历到value节点中;
  216. if self.__move2TargetNode(opa, True)[0] is False:
  217. if self.__move2TargetNode(opa, False)[0] is False:
  218. self.__back2Home(opa)
  219. return False
  220. return True
  221. '''
  222. 函数:获取当前option节点的value值。
  223. 参数:
  224. optionName 要获取值的option;
  225. 返回:Boolean, str/int/float
  226. '''
  227. def getOptionValue(self, optionName):
  228. self.info(u"【%s】" % optionName)
  229. CTMenu.sourceInput.setPattern(11)
  230. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  231. # 检测路径是否有效;
  232. if self.__openOption(opa) is False:
  233. return False
  234. # 获取value节点值;
  235. valueFocus, valueText = opa.isOnTargetNode()
  236. self.info(u"===当前捕获的文本内容=%s,聚焦状态:%d===" % (str(valueText), valueFocus))
  237. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  238. opa.back2ParentNode(False)
  239. # 返回主页;
  240. self.__back2Home(opa)
  241. return valueFocus, valueText
  242. '''
  243. 函数:
  244. 参数:
  245. 返回:
  246. '''
  247. def focusOption(self, optionName):
  248. self.info(u"【%s】" % optionName)
  249. CTMenu.sourceInput.setPattern(11)
  250. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  251. return self.__focusOption(opa)
  252. '''
  253. 函数:
  254. 参数:
  255. 返回:
  256. '''
  257. def inputUnlock(self, stdText, password=''):
  258. opa = COptionAction(None, None, self.__optionConfig, self.__optionExcel)
  259. return opa.inputUnlock(stdText, password)
  260. '''
  261. 函数:当焦点已经在option层级上时,移动到指定的option上。
  262. 参数:
  263. optionName 目标option.
  264. 返回:Boolean,成功移动到目标节点返回True。
  265. 注意:该函数不是从根节点开始移动到目标节点,而是假定焦点已经在目标节点层级菜单上。
  266. '''
  267. def moveToOption(self, optionName):
  268. opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
  269. # 已经在该层级上.
  270. opa.setCurPos(opa.getPathLength()-1)
  271. # 检测路径是否有效;
  272. if opa.checkRunOptionPath() is False:
  273. self.__back2Home(opa)
  274. return False
  275. # 遍历到目标option中;
  276. if self.__move2TargetNode(opa, True)[0] is False:
  277. if self.__move2TargetNode(opa, False)[0] is False:
  278. self.__back2Home(opa)
  279. return False
  280. self.info(u"已移动到目标节点[%s]" % optionName)
  281. return True
  282. '''
  283. 函数:
  284. 参数:
  285. 返回:
  286. '''
  287. def watchOption(self):
  288. pass
  289. if __name__ == "__main__":
  290. ml = CTMenu()
  291. if 0:
  292. st = 2
  293. ml.setOptionValue('picture_preset', 'personal')
  294. time.sleep(st)
  295. ml.setOptionValue('picture_preset', 'dynamic')
  296. time.sleep(st)
  297. ml.setOptionValue('picture_preset', 'stadium')
  298. time.sleep(st)
  299. ml.setOptionValue('picture_preset', 'standard')
  300. time.sleep(st)
  301. ml.setOptionValue('picture_preset', 'natural')
  302. time.sleep(st)
  303. ml.setOptionValue('picture_preset', 'movie')
  304. if 0:
  305. st = 5
  306. value = random.randint(0, 100)
  307. time.sleep(st)
  308. ml.setOptionValue('brightness', value)
  309. time.sleep(st)
  310. ml.setOptionValue('contrast', value)
  311. time.sleep(st)
  312. ml.setOptionValue('saturation', value)
  313. time.sleep(st)
  314. ml.setOptionValue('tint', value)
  315. time.sleep(st)
  316. ml.setOptionValue('sharpness', value)
  317. time.sleep(st)
  318. ml.setOptionValue('backlight', value)
  319. if 0:
  320. st = 2
  321. ml.checkOptionValue('picture_preset', 'personal')
  322. time.sleep(st)
  323. ml.checkOptionValue('picture_preset', 'dynamic')
  324. time.sleep(st)
  325. ml.checkOptionValue('picture_preset', 'stadium')
  326. time.sleep(st)
  327. ml.checkOptionValue('picture_preset', 'standard')
  328. time.sleep(st)
  329. ml.checkOptionValue('picture_preset', 'natural')
  330. time.sleep(st)
  331. ml.checkOptionValue('picture_preset', 'movie')
  332. if 0:
  333. st = 1
  334. value = random.randint(0, 100)
  335. ml.setOptionValue('backlight', value)
  336. time.sleep(st)
  337. ml.checkOptionValue('backlight', value + 10)
  338. time.sleep(st)
  339. ml.checkOptionValue('backlight', value)
  340. time.sleep(st)
  341. ml.setOptionValue('brightness', value)
  342. time.sleep(st)
  343. ml.checkOptionValue('brightness', value + 10)
  344. time.sleep(st)
  345. ml.checkOptionValue('brightness', value)
  346. time.sleep(st)
  347. ml.setOptionValue('contrast', value)
  348. time.sleep(st)
  349. ml.checkOptionValue('contrast', value + 10)
  350. time.sleep(st)
  351. ml.checkOptionValue('contrast', value)
  352. time.sleep(st)
  353. ml.setOptionValue('saturation', value)
  354. time.sleep(st)
  355. ml.checkOptionValue('saturation', value + 10)
  356. time.sleep(st)
  357. ml.checkOptionValue('saturation', value)
  358. time.sleep(st)
  359. ml.setOptionValue('tint', value)
  360. time.sleep(st)
  361. ml.checkOptionValue('tint', value + 10)
  362. time.sleep(st)
  363. ml.checkOptionValue('tint', value)
  364. time.sleep(st)
  365. ml.setOptionValue('sharpness', value)
  366. time.sleep(st)
  367. ml.checkOptionValue('sharpness', value + 10)
  368. time.sleep(st)
  369. ml.checkOptionValue('sharpness', value)
  370. time.sleep(st)
  371. if 0:
  372. st = 30
  373. ml.openOption('picture_preset')
  374. time.sleep(st)
  375. ml.openOption('brightness')
  376. time.sleep(st)
  377. ml.openOption('contrast')
  378. time.sleep(st)
  379. ml.openOption('tint')
  380. time.sleep(st)
  381. ml.openOption('sharpness')
  382. time.sleep(st)
  383. ml.openOption('backlight')
  384. time.sleep(st)
  385. if 0:
  386. st = 30
  387. value = random.randint(0, 100)
  388. ml.focusOptionValue('brightness', value)
  389. time.sleep(st)
  390. ml.focusOptionValue('contrast', value)
  391. time.sleep(st)
  392. ml.focusOptionValue('saturation', value)
  393. time.sleep(st)
  394. ml.focusOptionValue('tint', value)
  395. time.sleep(st)
  396. ml.focusOptionValue('sharpness', value)
  397. time.sleep(st)
  398. ml.focusOptionValue('backlight', value)
  399. time.sleep(st)
  400. ml.focusOptionValue('picture_preset', 'personal')
  401. time.sleep(st)
  402. ml.focusOptionValue('picture_preset', 'dynamic')
  403. time.sleep(st)
  404. ml.focusOptionValue('picture_preset', 'stadium')
  405. time.sleep(st)
  406. ml.focusOptionValue('picture_preset', 'standard')
  407. time.sleep(st)
  408. ml.focusOptionValue('picture_preset', 'natural')
  409. time.sleep(st)
  410. ml.focusOptionValue('picture_preset', 'movie')
  411. if 0:
  412. st = 2
  413. ml.getOptionValue('brightness')
  414. time.sleep(st)
  415. ml.getOptionValue('contrast')
  416. time.sleep(st)
  417. ml.getOptionValue('saturation')
  418. time.sleep(st)
  419. ml.getOptionValue('tint')
  420. time.sleep(st)
  421. ml.getOptionValue('sharpness')
  422. time.sleep(st)
  423. ml.getOptionValue('backlight')
  424. time.sleep(st)
  425. ml.getOptionValue('picture_preset')
  426. if 1:
  427. ml.openOption('picture')
  428. ml.moveToOption('brightness')
  429. ml.moveToOption('picture_reset')
  430. ml.moveToOption('picture_preset')