pyxllib 0.3.96__py3-none-any.whl → 0.3.200__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. pyxllib/__init__.py +21 -21
  2. pyxllib/algo/__init__.py +8 -8
  3. pyxllib/algo/disjoint.py +54 -54
  4. pyxllib/algo/geo.py +541 -529
  5. pyxllib/algo/intervals.py +964 -964
  6. pyxllib/algo/matcher.py +389 -311
  7. pyxllib/algo/newbie.py +166 -166
  8. pyxllib/algo/pupil.py +629 -461
  9. pyxllib/algo/shapelylib.py +67 -67
  10. pyxllib/algo/specialist.py +241 -240
  11. pyxllib/algo/stat.py +494 -458
  12. pyxllib/algo/treelib.py +149 -149
  13. pyxllib/algo/unitlib.py +66 -66
  14. {pyxlpr → pyxllib/autogui}/__init__.py +5 -5
  15. pyxllib/autogui/activewin.py +246 -0
  16. pyxllib/autogui/all.py +9 -0
  17. pyxllib/{ext/autogui → autogui}/autogui.py +852 -823
  18. pyxllib/autogui/uiautolib.py +362 -0
  19. pyxllib/{ext/autogui → autogui}/virtualkey.py +102 -102
  20. pyxllib/autogui/wechat.py +827 -0
  21. pyxllib/autogui/wechat_msg.py +421 -0
  22. pyxllib/autogui/wxautolib.py +84 -0
  23. pyxllib/cv/__init__.py +5 -5
  24. pyxllib/cv/expert.py +267 -267
  25. pyxllib/cv/imfile.py +159 -159
  26. pyxllib/cv/imhash.py +39 -39
  27. pyxllib/cv/pupil.py +9 -9
  28. pyxllib/cv/rgbfmt.py +1525 -1525
  29. pyxllib/cv/slidercaptcha.py +137 -0
  30. pyxllib/cv/trackbartools.py +251 -251
  31. pyxllib/cv/xlcvlib.py +1040 -1040
  32. pyxllib/cv/xlpillib.py +423 -423
  33. pyxllib/data/echarts.py +240 -129
  34. pyxllib/data/jsonlib.py +89 -0
  35. pyxllib/data/oss.py +72 -72
  36. pyxllib/data/pglib.py +1127 -643
  37. pyxllib/data/sqlite.py +568 -341
  38. pyxllib/data/sqllib.py +297 -297
  39. pyxllib/ext/JLineViewer.py +505 -492
  40. pyxllib/ext/__init__.py +6 -6
  41. pyxllib/ext/demolib.py +246 -246
  42. pyxllib/ext/drissionlib.py +277 -0
  43. pyxllib/ext/kq5034lib.py +12 -1606
  44. pyxllib/ext/old.py +663 -663
  45. pyxllib/ext/qt.py +449 -449
  46. pyxllib/ext/robustprocfile.py +497 -0
  47. pyxllib/ext/seleniumlib.py +76 -76
  48. pyxllib/ext/tk.py +173 -173
  49. pyxllib/ext/unixlib.py +827 -826
  50. pyxllib/ext/utools.py +351 -338
  51. pyxllib/ext/webhook.py +124 -101
  52. pyxllib/ext/win32lib.py +40 -40
  53. pyxllib/ext/wjxlib.py +88 -0
  54. pyxllib/ext/wpsapi.py +124 -0
  55. pyxllib/ext/xlwork.py +9 -0
  56. pyxllib/ext/yuquelib.py +1105 -173
  57. pyxllib/file/__init__.py +17 -17
  58. pyxllib/file/docxlib.py +761 -761
  59. pyxllib/file/gitlib.py +309 -309
  60. pyxllib/file/libreoffice.py +165 -0
  61. pyxllib/file/movielib.py +148 -139
  62. pyxllib/file/newbie.py +10 -10
  63. pyxllib/file/onenotelib.py +1469 -1469
  64. pyxllib/file/packlib/__init__.py +330 -293
  65. pyxllib/file/packlib/zipfile.py +2441 -2441
  66. pyxllib/file/pdflib.py +426 -426
  67. pyxllib/file/pupil.py +185 -185
  68. pyxllib/file/specialist/__init__.py +685 -685
  69. pyxllib/file/specialist/dirlib.py +799 -799
  70. pyxllib/file/specialist/download.py +193 -186
  71. pyxllib/file/specialist/filelib.py +2829 -2618
  72. pyxllib/file/xlsxlib.py +3131 -2976
  73. pyxllib/file/xlsyncfile.py +341 -0
  74. pyxllib/prog/__init__.py +5 -5
  75. pyxllib/prog/cachetools.py +64 -0
  76. pyxllib/prog/deprecatedlib.py +233 -233
  77. pyxllib/prog/filelock.py +42 -0
  78. pyxllib/prog/ipyexec.py +253 -253
  79. pyxllib/prog/multiprogs.py +940 -0
  80. pyxllib/prog/newbie.py +451 -444
  81. pyxllib/prog/pupil.py +1197 -1128
  82. pyxllib/prog/sitepackages.py +33 -33
  83. pyxllib/prog/specialist/__init__.py +391 -217
  84. pyxllib/prog/specialist/bc.py +203 -200
  85. pyxllib/prog/specialist/browser.py +497 -488
  86. pyxllib/prog/specialist/common.py +347 -347
  87. pyxllib/prog/specialist/datetime.py +199 -131
  88. pyxllib/prog/specialist/tictoc.py +240 -241
  89. pyxllib/prog/specialist/xllog.py +180 -180
  90. pyxllib/prog/xlosenv.py +108 -101
  91. pyxllib/stdlib/__init__.py +17 -17
  92. pyxllib/stdlib/tablepyxl/__init__.py +10 -10
  93. pyxllib/stdlib/tablepyxl/style.py +303 -303
  94. pyxllib/stdlib/tablepyxl/tablepyxl.py +130 -130
  95. pyxllib/text/__init__.py +8 -8
  96. pyxllib/text/ahocorasick.py +39 -39
  97. pyxllib/text/airscript.js +744 -0
  98. pyxllib/text/charclasslib.py +121 -109
  99. pyxllib/text/jiebalib.py +267 -264
  100. pyxllib/text/jinjalib.py +32 -0
  101. pyxllib/text/jsa_ai_prompt.md +271 -0
  102. pyxllib/text/jscode.py +922 -767
  103. pyxllib/text/latex/__init__.py +158 -158
  104. pyxllib/text/levenshtein.py +303 -303
  105. pyxllib/text/nestenv.py +1215 -1215
  106. pyxllib/text/newbie.py +300 -288
  107. pyxllib/text/pupil/__init__.py +8 -8
  108. pyxllib/text/pupil/common.py +1121 -1095
  109. pyxllib/text/pupil/xlalign.py +326 -326
  110. pyxllib/text/pycode.py +47 -47
  111. pyxllib/text/specialist/__init__.py +8 -8
  112. pyxllib/text/specialist/common.py +112 -112
  113. pyxllib/text/specialist/ptag.py +186 -186
  114. pyxllib/text/spellchecker.py +172 -172
  115. pyxllib/text/templates/echart_base.html +11 -0
  116. pyxllib/text/templates/highlight_code.html +17 -0
  117. pyxllib/text/templates/latex_editor.html +103 -0
  118. pyxllib/text/vbacode.py +17 -17
  119. pyxllib/text/xmllib.py +747 -685
  120. pyxllib/xl.py +42 -38
  121. pyxllib/xlcv.py +17 -17
  122. pyxllib-0.3.200.dist-info/METADATA +48 -0
  123. pyxllib-0.3.200.dist-info/RECORD +126 -0
  124. {pyxllib-0.3.96.dist-info → pyxllib-0.3.200.dist-info}/WHEEL +1 -2
  125. {pyxllib-0.3.96.dist-info → pyxllib-0.3.200.dist-info/licenses}/LICENSE +190 -190
  126. pyxllib/ext/autogui/__init__.py +0 -8
  127. pyxllib-0.3.96.dist-info/METADATA +0 -51
  128. pyxllib-0.3.96.dist-info/RECORD +0 -333
  129. pyxllib-0.3.96.dist-info/top_level.txt +0 -2
  130. pyxlpr/ai/__init__.py +0 -5
  131. pyxlpr/ai/clientlib.py +0 -1281
  132. pyxlpr/ai/specialist.py +0 -286
  133. pyxlpr/ai/torch_app.py +0 -172
  134. pyxlpr/ai/xlpaddle.py +0 -655
  135. pyxlpr/ai/xltorch.py +0 -705
  136. pyxlpr/data/__init__.py +0 -11
  137. pyxlpr/data/coco.py +0 -1325
  138. pyxlpr/data/datacls.py +0 -365
  139. pyxlpr/data/datasets.py +0 -200
  140. pyxlpr/data/gptlib.py +0 -1291
  141. pyxlpr/data/icdar/__init__.py +0 -96
  142. pyxlpr/data/icdar/deteval.py +0 -377
  143. pyxlpr/data/icdar/icdar2013.py +0 -341
  144. pyxlpr/data/icdar/iou.py +0 -340
  145. pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -463
  146. pyxlpr/data/imtextline.py +0 -473
  147. pyxlpr/data/labelme.py +0 -866
  148. pyxlpr/data/removeline.py +0 -179
  149. pyxlpr/data/specialist.py +0 -57
  150. pyxlpr/eval/__init__.py +0 -85
  151. pyxlpr/paddleocr.py +0 -776
  152. pyxlpr/ppocr/__init__.py +0 -15
  153. pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -226
  154. pyxlpr/ppocr/data/__init__.py +0 -135
  155. pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -26
  156. pyxlpr/ppocr/data/imaug/__init__.py +0 -67
  157. pyxlpr/ppocr/data/imaug/copy_paste.py +0 -170
  158. pyxlpr/ppocr/data/imaug/east_process.py +0 -437
  159. pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -244
  160. pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -114
  161. pyxlpr/ppocr/data/imaug/label_ops.py +0 -789
  162. pyxlpr/ppocr/data/imaug/make_border_map.py +0 -184
  163. pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -106
  164. pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -126
  165. pyxlpr/ppocr/data/imaug/operators.py +0 -433
  166. pyxlpr/ppocr/data/imaug/pg_process.py +0 -906
  167. pyxlpr/ppocr/data/imaug/randaugment.py +0 -143
  168. pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -239
  169. pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -533
  170. pyxlpr/ppocr/data/imaug/sast_process.py +0 -777
  171. pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -17
  172. pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -120
  173. pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -168
  174. pyxlpr/ppocr/data/lmdb_dataset.py +0 -115
  175. pyxlpr/ppocr/data/pgnet_dataset.py +0 -104
  176. pyxlpr/ppocr/data/pubtab_dataset.py +0 -107
  177. pyxlpr/ppocr/data/simple_dataset.py +0 -372
  178. pyxlpr/ppocr/losses/__init__.py +0 -61
  179. pyxlpr/ppocr/losses/ace_loss.py +0 -52
  180. pyxlpr/ppocr/losses/basic_loss.py +0 -135
  181. pyxlpr/ppocr/losses/center_loss.py +0 -88
  182. pyxlpr/ppocr/losses/cls_loss.py +0 -30
  183. pyxlpr/ppocr/losses/combined_loss.py +0 -67
  184. pyxlpr/ppocr/losses/det_basic_loss.py +0 -208
  185. pyxlpr/ppocr/losses/det_db_loss.py +0 -80
  186. pyxlpr/ppocr/losses/det_east_loss.py +0 -63
  187. pyxlpr/ppocr/losses/det_pse_loss.py +0 -149
  188. pyxlpr/ppocr/losses/det_sast_loss.py +0 -121
  189. pyxlpr/ppocr/losses/distillation_loss.py +0 -272
  190. pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -140
  191. pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -113
  192. pyxlpr/ppocr/losses/rec_aster_loss.py +0 -99
  193. pyxlpr/ppocr/losses/rec_att_loss.py +0 -39
  194. pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -44
  195. pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -70
  196. pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -30
  197. pyxlpr/ppocr/losses/rec_sar_loss.py +0 -28
  198. pyxlpr/ppocr/losses/rec_srn_loss.py +0 -47
  199. pyxlpr/ppocr/losses/table_att_loss.py +0 -109
  200. pyxlpr/ppocr/metrics/__init__.py +0 -44
  201. pyxlpr/ppocr/metrics/cls_metric.py +0 -45
  202. pyxlpr/ppocr/metrics/det_metric.py +0 -82
  203. pyxlpr/ppocr/metrics/distillation_metric.py +0 -73
  204. pyxlpr/ppocr/metrics/e2e_metric.py +0 -86
  205. pyxlpr/ppocr/metrics/eval_det_iou.py +0 -274
  206. pyxlpr/ppocr/metrics/kie_metric.py +0 -70
  207. pyxlpr/ppocr/metrics/rec_metric.py +0 -75
  208. pyxlpr/ppocr/metrics/table_metric.py +0 -50
  209. pyxlpr/ppocr/modeling/architectures/__init__.py +0 -32
  210. pyxlpr/ppocr/modeling/architectures/base_model.py +0 -88
  211. pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -60
  212. pyxlpr/ppocr/modeling/backbones/__init__.py +0 -54
  213. pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -268
  214. pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -246
  215. pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -285
  216. pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -265
  217. pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -186
  218. pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -138
  219. pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -258
  220. pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -48
  221. pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -210
  222. pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -143
  223. pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -307
  224. pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -286
  225. pyxlpr/ppocr/modeling/heads/__init__.py +0 -54
  226. pyxlpr/ppocr/modeling/heads/cls_head.py +0 -52
  227. pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -118
  228. pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -121
  229. pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -37
  230. pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -128
  231. pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -253
  232. pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -206
  233. pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -163
  234. pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -393
  235. pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -202
  236. pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -88
  237. pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -826
  238. pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -402
  239. pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -280
  240. pyxlpr/ppocr/modeling/heads/self_attention.py +0 -406
  241. pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -246
  242. pyxlpr/ppocr/modeling/necks/__init__.py +0 -32
  243. pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -111
  244. pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -188
  245. pyxlpr/ppocr/modeling/necks/fpn.py +0 -138
  246. pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -314
  247. pyxlpr/ppocr/modeling/necks/rnn.py +0 -92
  248. pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -284
  249. pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -110
  250. pyxlpr/ppocr/modeling/transforms/__init__.py +0 -28
  251. pyxlpr/ppocr/modeling/transforms/stn.py +0 -135
  252. pyxlpr/ppocr/modeling/transforms/tps.py +0 -308
  253. pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -156
  254. pyxlpr/ppocr/optimizer/__init__.py +0 -61
  255. pyxlpr/ppocr/optimizer/learning_rate.py +0 -228
  256. pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -49
  257. pyxlpr/ppocr/optimizer/optimizer.py +0 -160
  258. pyxlpr/ppocr/optimizer/regularizer.py +0 -52
  259. pyxlpr/ppocr/postprocess/__init__.py +0 -55
  260. pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -33
  261. pyxlpr/ppocr/postprocess/db_postprocess.py +0 -234
  262. pyxlpr/ppocr/postprocess/east_postprocess.py +0 -143
  263. pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -200
  264. pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -52
  265. pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -15
  266. pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -29
  267. pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -14
  268. pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -118
  269. pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -654
  270. pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -355
  271. pyxlpr/ppocr/tools/__init__.py +0 -14
  272. pyxlpr/ppocr/tools/eval.py +0 -83
  273. pyxlpr/ppocr/tools/export_center.py +0 -77
  274. pyxlpr/ppocr/tools/export_model.py +0 -129
  275. pyxlpr/ppocr/tools/infer/predict_cls.py +0 -151
  276. pyxlpr/ppocr/tools/infer/predict_det.py +0 -300
  277. pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -169
  278. pyxlpr/ppocr/tools/infer/predict_rec.py +0 -414
  279. pyxlpr/ppocr/tools/infer/predict_system.py +0 -204
  280. pyxlpr/ppocr/tools/infer/utility.py +0 -629
  281. pyxlpr/ppocr/tools/infer_cls.py +0 -83
  282. pyxlpr/ppocr/tools/infer_det.py +0 -134
  283. pyxlpr/ppocr/tools/infer_e2e.py +0 -122
  284. pyxlpr/ppocr/tools/infer_kie.py +0 -153
  285. pyxlpr/ppocr/tools/infer_rec.py +0 -146
  286. pyxlpr/ppocr/tools/infer_table.py +0 -107
  287. pyxlpr/ppocr/tools/program.py +0 -596
  288. pyxlpr/ppocr/tools/test_hubserving.py +0 -117
  289. pyxlpr/ppocr/tools/train.py +0 -163
  290. pyxlpr/ppocr/tools/xlprog.py +0 -748
  291. pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -94
  292. pyxlpr/ppocr/utils/__init__.py +0 -24
  293. pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -117
  294. pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -162
  295. pyxlpr/ppocr/utils/dict/be_dict.txt +0 -145
  296. pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -140
  297. pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -8421
  298. pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -163
  299. pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -167
  300. pyxlpr/ppocr/utils/dict/en_dict.txt +0 -63
  301. pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -136
  302. pyxlpr/ppocr/utils/dict/french_dict.txt +0 -136
  303. pyxlpr/ppocr/utils/dict/german_dict.txt +0 -143
  304. pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -162
  305. pyxlpr/ppocr/utils/dict/it_dict.txt +0 -118
  306. pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -4399
  307. pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -153
  308. pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -3688
  309. pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -185
  310. pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -153
  311. pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -153
  312. pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -96
  313. pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -130
  314. pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -91
  315. pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -134
  316. pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -125
  317. pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -128
  318. pyxlpr/ppocr/utils/dict/table_dict.txt +0 -277
  319. pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -2759
  320. pyxlpr/ppocr/utils/dict/te_dict.txt +0 -151
  321. pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -114
  322. pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -142
  323. pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -137
  324. pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -110
  325. pyxlpr/ppocr/utils/dict90.txt +0 -90
  326. pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -574
  327. pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -83
  328. pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -87
  329. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -457
  330. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -592
  331. pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -162
  332. pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -162
  333. pyxlpr/ppocr/utils/en_dict.txt +0 -95
  334. pyxlpr/ppocr/utils/gen_label.py +0 -81
  335. pyxlpr/ppocr/utils/ic15_dict.txt +0 -36
  336. pyxlpr/ppocr/utils/iou.py +0 -54
  337. pyxlpr/ppocr/utils/logging.py +0 -69
  338. pyxlpr/ppocr/utils/network.py +0 -84
  339. pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -6623
  340. pyxlpr/ppocr/utils/profiler.py +0 -110
  341. pyxlpr/ppocr/utils/save_load.py +0 -150
  342. pyxlpr/ppocr/utils/stats.py +0 -72
  343. pyxlpr/ppocr/utils/utility.py +0 -80
  344. pyxlpr/ppstructure/__init__.py +0 -13
  345. pyxlpr/ppstructure/predict_system.py +0 -187
  346. pyxlpr/ppstructure/table/__init__.py +0 -13
  347. pyxlpr/ppstructure/table/eval_table.py +0 -72
  348. pyxlpr/ppstructure/table/matcher.py +0 -192
  349. pyxlpr/ppstructure/table/predict_structure.py +0 -136
  350. pyxlpr/ppstructure/table/predict_table.py +0 -221
  351. pyxlpr/ppstructure/table/table_metric/__init__.py +0 -16
  352. pyxlpr/ppstructure/table/table_metric/parallel.py +0 -51
  353. pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -247
  354. pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -13
  355. pyxlpr/ppstructure/table/tablepyxl/style.py +0 -283
  356. pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -118
  357. pyxlpr/ppstructure/utility.py +0 -71
  358. pyxlpr/xlai.py +0 -10
@@ -0,0 +1,362 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/11/05
6
+
7
+ """
8
+ 以uiautomation为核心的相关工具库
9
+ """
10
+
11
+ import os
12
+ import sys
13
+ import textwrap
14
+ import time
15
+ from typing import Iterable, Callable, List
16
+ import subprocess
17
+ import tempfile
18
+
19
+ import psutil
20
+ import pandas as pd
21
+ from fastcore.basics import GetAttr
22
+
23
+ from loguru import logger
24
+ # ui组件大多是树形组织结构,auto库自带树形操作太弱。没有专业的树形结构库,能搞个毛线。
25
+ from anytree import NodeMixin
26
+
27
+ import ctypes
28
+ from ctypes import wintypes
29
+
30
+ if sys.platform == 'win32':
31
+ import win32con
32
+ import win32gui
33
+ import win32process
34
+ import win32clipboard
35
+
36
+ import uiautomation as uia
37
+ from uiautomation import WindowControl
38
+
39
+
40
+ def __1_clipboard_utils():
41
+ pass
42
+
43
+
44
+ def retry_on_failure(max_retries: int = 5):
45
+ """
46
+ 一个装饰器,用于在失败时重试执行被装饰的函数。
47
+
48
+ Args:
49
+ max_retries (int): 最大重试次数。
50
+
51
+ Returns:
52
+ Callable: 包装后的函数。
53
+ """
54
+
55
+ def decorator(func: Callable):
56
+ def wrapper(*args, **kwargs):
57
+ for attempt in range(max_retries):
58
+ try:
59
+ if func(*args, **kwargs):
60
+ return True
61
+ except Exception as e:
62
+ time.sleep(.05)
63
+ print(f"Attempt {attempt + 1} failed: {e}")
64
+ return False
65
+
66
+ return wrapper
67
+
68
+ return decorator
69
+
70
+
71
+ def set_clipboard_data(fmt: int, buf: ctypes.Array) -> bool:
72
+ """
73
+ 将数据设置到Windows剪切板中。
74
+
75
+ Args:
76
+ fmt (int): 数据格式,例如 win32clipboard.CF_HDROP。
77
+ buf (ctypes.Array): 要设置到剪切板的数据。
78
+
79
+ Returns:
80
+ bool: 操作成功返回 True,否则返回 False。
81
+ """
82
+ try:
83
+ win32clipboard.OpenClipboard()
84
+ win32clipboard.EmptyClipboard()
85
+ win32clipboard.SetClipboardData(fmt, buf)
86
+ return True
87
+ except Exception as e:
88
+ print(f"Error setting clipboard data: {e}")
89
+ return False
90
+ finally:
91
+ win32clipboard.CloseClipboard()
92
+
93
+
94
+ def get_clipboard_files() -> List[str]:
95
+ """
96
+ 获取剪切板中的文件路径列表。
97
+
98
+ Returns:
99
+ List[str]: 包含剪切板中文件路径的列表,如果没有文件路径或操作失败,返回空列表。
100
+ """
101
+ try:
102
+ win32clipboard.OpenClipboard()
103
+ if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
104
+ return list(win32clipboard.GetClipboardData(win32clipboard.CF_HDROP))
105
+ else:
106
+ return list()
107
+ finally:
108
+ win32clipboard.CloseClipboard()
109
+
110
+
111
+ @retry_on_failure(max_retries=5)
112
+ def validate_clipboard_files(file_paths: Iterable[str], fmt: int, buf: ctypes.Array) -> bool:
113
+ """
114
+ 验证剪切板中的文件路径是否与给定的文件路径一致。
115
+
116
+ Args:
117
+ file_paths (Iterable): 一个包含文件路径的可迭代对象,每个路径都是一个字符串。
118
+ fmt (int): 数据格式,例如 win32clipboard.CF_HDROP。
119
+ buf (ctypes.Array): 要验证的剪切板数据。
120
+
121
+ Returns:
122
+ bool: 如果剪切板中的文件路径与给定的文件路径一致,则返回 True
123
+
124
+ Raises:
125
+ ValueError: 如果剪切板文件路径与给定文件路径不一致。
126
+ """
127
+ # 设置文件到剪切板
128
+ set_clipboard_data(fmt, buf)
129
+ # 验证剪切板中的文件路径是否与给定的文件路径一致
130
+ if set(get_clipboard_files()) == set(file_paths):
131
+ return True
132
+ raise ValueError("剪切板文件路径不对哇!")
133
+
134
+
135
+ def copy_files_to_clipboard(file_paths: Iterable[str]) -> bool:
136
+ """
137
+ 将一系列文件路径复制到Windows剪切板。这允许用户在其他应用程序中,如文件资源管理器中粘贴这些文件。
138
+
139
+ Args:
140
+ file_paths (Iterable): 一个包含文件路径的可迭代对象,每个路径都是一个字符串。
141
+
142
+ Returns:
143
+ bool: 如果成功将文件路径复制到剪切板,则返回 True,否则返回 False
144
+ """
145
+ # 定义所需的 Windows 结构和函数
146
+ CF_HDROP = 15
147
+
148
+ class DROPFILES(ctypes.Structure):
149
+ _fields_ = [("pFiles", wintypes.DWORD),
150
+ ("pt", wintypes.POINT),
151
+ ("fNC", wintypes.BOOL),
152
+ ("fWide", wintypes.BOOL)]
153
+
154
+ offset = ctypes.sizeof(DROPFILES)
155
+ length = sum(len(p) + 1 for p in file_paths) + 1
156
+ size = offset + length * ctypes.sizeof(wintypes.WCHAR)
157
+ buf = (ctypes.c_char * size)()
158
+ df = DROPFILES.from_buffer(buf)
159
+ df.pFiles, df.fWide = offset, True
160
+ for path in file_paths:
161
+ path = os.path.normpath(path)
162
+ array_t = ctypes.c_wchar * (len(path) + 1)
163
+ path_buf = array_t.from_buffer(buf, offset)
164
+ path_buf.value = path
165
+ offset += ctypes.sizeof(path_buf)
166
+ buf[offset:offset + ctypes.sizeof(wintypes.WCHAR)] = b'\0\0'
167
+
168
+ # 验证文件是否成功复制到剪切板
169
+ return validate_clipboard_files([os.path.normpath(file) for file in file_paths], CF_HDROP, buf=buf)
170
+
171
+
172
+ def __2_窗口功能():
173
+ pass
174
+
175
+
176
+ def get_windows_info():
177
+ """ 得到当前机器的全部窗口信息清单 """
178
+ window_list = []
179
+
180
+ def get_all_hwnd(hwnd, mouse):
181
+ thread_id, process_id = win32process.GetWindowThreadProcessId(hwnd)
182
+ proc = psutil.Process(process_id)
183
+
184
+ is_window = win32gui.IsWindow(hwnd)
185
+ is_enabled = win32gui.IsWindowEnabled(hwnd)
186
+ is_visible = win32gui.IsWindowVisible(hwnd)
187
+ text = win32gui.GetWindowText(hwnd)
188
+
189
+ data = {
190
+ 'proc_name': proc.name(),
191
+ 'process_id': process_id,
192
+ 'thread_id': thread_id,
193
+ 'hwnd': hwnd,
194
+ 'ClassName': win32gui.GetClassName(hwnd),
195
+ 'ControlTypeName': '',
196
+ 'WindowText': text,
197
+ 'IsWindow': is_window,
198
+ 'IsWindowEnabled': is_enabled,
199
+ 'IsWindowVisible': is_visible
200
+ }
201
+
202
+ if not data['proc_name'].endswith('.tmp') and is_visible:
203
+ ctrl = uia.ControlFromHandle(hwnd)
204
+ data['ControlTypeName'] = ctrl.ControlTypeName
205
+
206
+ window_list.append(data)
207
+
208
+ win32gui.EnumWindows(get_all_hwnd, 0)
209
+ return pd.DataFrame(window_list)
210
+
211
+
212
+ def find_ctrl(class_name=None, name=None, **kwargs):
213
+ if class_name is not None:
214
+ kwargs['ClassName'] = class_name
215
+ if name is not None:
216
+ kwargs['Name'] = name
217
+ ctrl = uia.WindowControl(**kwargs)
218
+ return ctrl
219
+
220
+
221
+ class UiCtrlNode(NodeMixin, GetAttr, WindowControl):
222
+ _default = 'ctrl'
223
+
224
+ def __0_构建(self):
225
+ pass
226
+
227
+ def __init__(self, ctrl, parent=None, *, build_depth=-1):
228
+ """
229
+ :param ctrl: 当前节点
230
+ :param parent: 父结点
231
+ :param build_depth: 自动构建多少层树节点,默认-1表示构建全部节点
232
+ """
233
+ # 初始化节点信息
234
+ self.ctrl = ctrl
235
+ # 试过了,没用,因为新找出来的都是新构建的类,找不到proxy的
236
+ # self.ctrl.proxy: 'UiCtrlNode' = self # 再给其扩展一个proxy属性,指向其升级过的对象
237
+ self.ctrl_type = ctrl.ControlTypeName
238
+ self.text = ctrl.Name
239
+ self.parent = parent # 指定父节点,用于形成树结构
240
+
241
+ # 自动递归创建子节点
242
+ self.build_children(build_depth)
243
+
244
+ @classmethod
245
+ def init_from_name(cls, class_name=None, name=None, *, build_depth=-1, **kwargs):
246
+ ctrl = find_ctrl(class_name=class_name, name=name, **kwargs)
247
+ return cls(ctrl, build_depth=build_depth)
248
+
249
+ def activate(self, check_seconds=2):
250
+ """ 激活当前窗口
251
+ """
252
+ while True:
253
+ # todo 这种限定情况并不严谨,有概率出现重复的~
254
+ hwnd = win32gui.FindWindow(self.ctrl.ClassName, self.text)
255
+ # logger.info(hwnd)
256
+ if not hwnd:
257
+ return
258
+
259
+ if win32gui.GetForegroundWindow() != hwnd:
260
+ win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
261
+
262
+ try:
263
+ # 在这里执行SetForegroundWindow,只有程序的第1次运行有效,之后就会被很多全屏类的应用占用最前置,覆盖不了了
264
+ # 为了解决这问题,就只能暴力每次都新开一个程序来执行这个SetForegroundWindow操作
265
+ subprocess.run(
266
+ [sys.executable, "-c", f"import win32gui; win32gui.SetForegroundWindow({hwnd})"],
267
+ stdout=subprocess.PIPE,
268
+ )
269
+ except Exception as e:
270
+ pass
271
+ # 理论上并不需要等待,但加个等待,有助于稳定性检测,如果当前窗口在check_seconds秒内频繁切换,
272
+ # 使用activate虽然激活了,但并不安全,只有check_seconds秒内维持稳定在这个窗口,再进行下游任务会更好
273
+ time.sleep(check_seconds)
274
+ else:
275
+ break
276
+
277
+ def build_children(self, build_depth=-1, child_node_class=None):
278
+ """ 创建并添加子节点到树中 """
279
+ if build_depth == 0:
280
+ return
281
+ self.children = [] # 删除现有的所有子结点
282
+ child_node_class = child_node_class or self.__class__
283
+ for child_ctrl in self.ctrl.GetChildren():
284
+ child_node_class(child_ctrl, parent=self, build_depth=build_depth - 1)
285
+
286
+ def __1_调试(self):
287
+ pass
288
+
289
+ def trace_rect(self, duration_per_circle=2, num_circles=1):
290
+ """ 用鼠标勾画出当前组件的矩形位置区域 """
291
+ from pyxllib.autogui.autogui import UiTracePath
292
+
293
+ rect = self.ctrl.BoundingRectangle
294
+ ltrb = [rect.left, rect.top, rect.right, rect.bottom]
295
+ UiTracePath.from_ltrb(ltrb,
296
+ duration_per_circle=duration_per_circle,
297
+ num_circles=num_circles)
298
+
299
+ def __2_功能(self):
300
+ pass
301
+
302
+ def __getattr__(self, item):
303
+ # 尝试从self.ctrl中获取属性
304
+ return getattr(self.ctrl, item)
305
+
306
+ def __getitem__(self, index):
307
+ """ 通过索引直接访问子节点
308
+
309
+ ui操作经常要各种结构化的访问,加个这个简化引用方式
310
+ """
311
+ try:
312
+ return self.children[index]
313
+ except IndexError: # 如果出现下标错误,需要自动重新刷新所有控件
314
+ # self.parent重建是不够的,但我也不知道为什么self.root重建后就可以了
315
+ # 我的理解是重建后self自己不是都不存在了?
316
+ self.root.build_children()
317
+ # 应该在有些情况下self.root重建还能继续使用,但有些特殊情况应该会炸
318
+ return self.children[index]
319
+
320
+ def get_ctrl_hash_tag(self, level=1):
321
+ """ 生成节点的哈希字符串,以反映子树结构,一般用来对节点做分类及映射到对应处理函数 """
322
+ # 当前节点的类型标识符
323
+ hash_strs = [f"{level}{self.ctrl_type[0].lower()}"]
324
+ # 遍历所有子节点,递归生成子节点的哈希值
325
+ for child in self.children:
326
+ hash_strs.append(f"{child.get_ctrl_hash_tag(level + 1)}")
327
+ return ''.join(hash_strs)
328
+
329
+ def __3_展示(self):
330
+ pass
331
+
332
+ def _format_text(self, text):
333
+ """ 将换行替换为空格的小工具方法 """
334
+ return text.replace('\n', ' ')
335
+
336
+ def __repr__(self):
337
+ """ 用于在打印节点时显示关键信息 """
338
+ return f"UiNode(ctrl_type={self.ctrl_type}, text={self._format_text(self.text)})"
339
+
340
+ def render_tree(self):
341
+ """ 展示以self为根节点的整体内容结构 """
342
+ # 1 渲染自身
343
+ line = [self.ctrl_type]
344
+ line.append(self._format_text(self.text))
345
+
346
+ # 加上控件的坐标信息
347
+ rect = self.ctrl.BoundingRectangle
348
+ line.append(f"[{rect.left}, {rect.top}, {rect.right}, {rect.bottom}]")
349
+
350
+ # 我的hash值
351
+ tag = self.get_ctrl_hash_tag()
352
+ if len(tag) <= 64:
353
+ line.append(tag)
354
+
355
+ lines = [' '.join(line)]
356
+
357
+ # 2 子结点情况
358
+ for child in self.children:
359
+ line = child.render_tree()
360
+ line = textwrap.indent(line, ' ')
361
+ lines.append(line)
362
+ return '\n'.join(lines)
@@ -1,102 +1,102 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # @Author : 陈坤泽
4
- # @Email : 877362867@qq.com
5
- # @Date : 2021/08/01 15:28
6
-
7
- import time
8
- import sys
9
-
10
- ____press_key = """
11
- TODO 有待进一步封装整理
12
-
13
- 简化按键映射、简化PressKey和ReleaseKey过程
14
- https://www.icode9.com/content-1-787701.html
15
-
16
- 简洁版可以使用: https://pypi.org/project/VirtualKey/
17
- 看源码原理基本相同,但实测还是有失灵的时候(HD3_Launcher.exe打开的游戏无法接受按键信息)
18
- 所以我还是要自己留一套版本
19
- """
20
-
21
- if sys.platform == 'win32':
22
- import ctypes
23
-
24
- KEY_MAPPING = {'num1': 2, 'num2': 3, 'num3': 4, 'num4': 5, 'num5': 6,
25
- 'num6': 7, 'num7': 8, 'num8': 9, 'num9': 10, 'num0': 11,
26
- 'escape': 1, 'equal': 13, 'backspace': 14, 'tab': 15, 'q': 16,
27
- 'w': 17, 'e': 18, 'r': 19, 't': 20, 'y': 21,
28
- 'u': 22, 'i': 23, 'o': 24, 'p': 25, 'enter': 28,
29
- 'lcontrol': 29, 'a': 30, 's': 31, 'd': 32, 'f': 33,
30
- 'g': 34, 'h': 35, 'j': 36, 'k': 37, 'l': 38,
31
- 'z': 44, 'x': 45, 'c': 46, 'v': 47, 'b': 48,
32
- 'n': 49, 'm': 50, 'shift': 54, 'multiply': 55, 'space': 57,
33
- 'capital': 58, 'f1': 59, 'f2': 60, 'f3': 61, 'f4': 62,
34
- 'f5': 63, 'f6': 64, 'f7': 65, 'f8': 66, 'f9': 67,
35
- 'f10': 68, 'numlock': 69, 'f11': 87, 'f12': 88, 'divide': 181,
36
- 'home': 199, 'up': 200, 'prior': 201, 'left': 203, 'right': 205,
37
- 'end': 207, 'down': 208, 'next': 209, 'insert': 210, 'delete': 211}
38
-
39
- SendInput = ctypes.windll.user32.SendInput
40
-
41
- # C struct redefinitions
42
- PUL = ctypes.POINTER(ctypes.c_ulong)
43
-
44
-
45
- class KeyBdInput(ctypes.Structure):
46
- _fields_ = [("wVk", ctypes.c_ushort),
47
- ("wScan", ctypes.c_ushort),
48
- ("dwFlags", ctypes.c_ulong),
49
- ("time", ctypes.c_ulong),
50
- ("dwExtraInfo", PUL)]
51
-
52
-
53
- class HardwareInput(ctypes.Structure):
54
- _fields_ = [("uMsg", ctypes.c_ulong),
55
- ("wParamL", ctypes.c_short),
56
- ("wParamH", ctypes.c_ushort)]
57
-
58
-
59
- class MouseInput(ctypes.Structure):
60
- _fields_ = [("dx", ctypes.c_long),
61
- ("dy", ctypes.c_long),
62
- ("mouseData", ctypes.c_ulong),
63
- ("dwFlags", ctypes.c_ulong),
64
- ("time", ctypes.c_ulong),
65
- ("dwExtraInfo", PUL)]
66
-
67
-
68
- class Input_I(ctypes.Union):
69
- _fields_ = [("ki", KeyBdInput),
70
- ("mi", MouseInput),
71
- ("hi", HardwareInput)]
72
-
73
-
74
- class Input(ctypes.Structure):
75
- _fields_ = [("type", ctypes.c_ulong),
76
- ("ii", Input_I)]
77
-
78
-
79
- # Actuals Functions
80
-
81
- def PressKey(hexKeyCode):
82
- extra = ctypes.c_ulong(0)
83
- ii_ = Input_I()
84
- ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra))
85
- x = Input(ctypes.c_ulong(1), ii_)
86
- ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
87
-
88
-
89
- def ReleaseKey(hexKeyCode):
90
- extra = ctypes.c_ulong(0)
91
- ii_ = Input_I()
92
- ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra))
93
- x = Input(ctypes.c_ulong(1), ii_)
94
- ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
95
-
96
-
97
- def down_up(ch, t=0.5):
98
- ch = KEY_MAPPING[ch]
99
- PressKey(ch)
100
- time.sleep(t)
101
- ReleaseKey(ch)
102
- return 1
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2021/08/01 15:28
6
+
7
+ import time
8
+ import sys
9
+
10
+ ____press_key = """
11
+ TODO 有待进一步封装整理
12
+
13
+ 简化按键映射、简化PressKey和ReleaseKey过程
14
+ https://www.icode9.com/content-1-787701.html
15
+
16
+ 简洁版可以使用: https://pypi.org/project/VirtualKey/
17
+ 看源码原理基本相同,但实测还是有失灵的时候(HD3_Launcher.exe打开的游戏无法接受按键信息)
18
+ 所以我还是要自己留一套版本
19
+ """
20
+
21
+ if sys.platform == 'win32':
22
+ import ctypes
23
+
24
+ KEY_MAPPING = {'num1': 2, 'num2': 3, 'num3': 4, 'num4': 5, 'num5': 6,
25
+ 'num6': 7, 'num7': 8, 'num8': 9, 'num9': 10, 'num0': 11,
26
+ 'escape': 1, 'equal': 13, 'backspace': 14, 'tab': 15, 'q': 16,
27
+ 'w': 17, 'e': 18, 'r': 19, 't': 20, 'y': 21,
28
+ 'u': 22, 'i': 23, 'o': 24, 'p': 25, 'enter': 28,
29
+ 'lcontrol': 29, 'a': 30, 's': 31, 'd': 32, 'f': 33,
30
+ 'g': 34, 'h': 35, 'j': 36, 'k': 37, 'l': 38,
31
+ 'z': 44, 'x': 45, 'c': 46, 'v': 47, 'b': 48,
32
+ 'n': 49, 'm': 50, 'shift': 54, 'multiply': 55, 'space': 57,
33
+ 'capital': 58, 'f1': 59, 'f2': 60, 'f3': 61, 'f4': 62,
34
+ 'f5': 63, 'f6': 64, 'f7': 65, 'f8': 66, 'f9': 67,
35
+ 'f10': 68, 'numlock': 69, 'f11': 87, 'f12': 88, 'divide': 181,
36
+ 'home': 199, 'up': 200, 'prior': 201, 'left': 203, 'right': 205,
37
+ 'end': 207, 'down': 208, 'next': 209, 'insert': 210, 'delete': 211}
38
+
39
+ SendInput = ctypes.windll.user32.SendInput
40
+
41
+ # C struct redefinitions
42
+ PUL = ctypes.POINTER(ctypes.c_ulong)
43
+
44
+
45
+ class KeyBdInput(ctypes.Structure):
46
+ _fields_ = [("wVk", ctypes.c_ushort),
47
+ ("wScan", ctypes.c_ushort),
48
+ ("dwFlags", ctypes.c_ulong),
49
+ ("time", ctypes.c_ulong),
50
+ ("dwExtraInfo", PUL)]
51
+
52
+
53
+ class HardwareInput(ctypes.Structure):
54
+ _fields_ = [("uMsg", ctypes.c_ulong),
55
+ ("wParamL", ctypes.c_short),
56
+ ("wParamH", ctypes.c_ushort)]
57
+
58
+
59
+ class MouseInput(ctypes.Structure):
60
+ _fields_ = [("dx", ctypes.c_long),
61
+ ("dy", ctypes.c_long),
62
+ ("mouseData", ctypes.c_ulong),
63
+ ("dwFlags", ctypes.c_ulong),
64
+ ("time", ctypes.c_ulong),
65
+ ("dwExtraInfo", PUL)]
66
+
67
+
68
+ class Input_I(ctypes.Union):
69
+ _fields_ = [("ki", KeyBdInput),
70
+ ("mi", MouseInput),
71
+ ("hi", HardwareInput)]
72
+
73
+
74
+ class Input(ctypes.Structure):
75
+ _fields_ = [("type", ctypes.c_ulong),
76
+ ("ii", Input_I)]
77
+
78
+
79
+ # Actuals Functions
80
+
81
+ def PressKey(hexKeyCode):
82
+ extra = ctypes.c_ulong(0)
83
+ ii_ = Input_I()
84
+ ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra))
85
+ x = Input(ctypes.c_ulong(1), ii_)
86
+ ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
87
+
88
+
89
+ def ReleaseKey(hexKeyCode):
90
+ extra = ctypes.c_ulong(0)
91
+ ii_ = Input_I()
92
+ ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra))
93
+ x = Input(ctypes.c_ulong(1), ii_)
94
+ ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
95
+
96
+
97
+ def down_up(ch, t=0.5):
98
+ ch = KEY_MAPPING[ch]
99
+ PressKey(ch)
100
+ time.sleep(t)
101
+ ReleaseKey(ch)
102
+ return 1