pyxllib 0.3.96__py3-none-any.whl → 0.3.197__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 (306) hide show
  1. pyxllib/algo/geo.py +12 -0
  2. pyxllib/algo/intervals.py +1 -1
  3. pyxllib/algo/matcher.py +78 -0
  4. pyxllib/algo/pupil.py +187 -19
  5. pyxllib/algo/specialist.py +2 -1
  6. pyxllib/algo/stat.py +38 -2
  7. {pyxlpr → pyxllib/autogui}/__init__.py +1 -1
  8. pyxllib/autogui/activewin.py +246 -0
  9. pyxllib/autogui/all.py +9 -0
  10. pyxllib/{ext/autogui → autogui}/autogui.py +40 -11
  11. pyxllib/autogui/uiautolib.py +362 -0
  12. pyxllib/autogui/wechat.py +827 -0
  13. pyxllib/autogui/wechat_msg.py +421 -0
  14. pyxllib/autogui/wxautolib.py +84 -0
  15. pyxllib/cv/slidercaptcha.py +137 -0
  16. pyxllib/data/echarts.py +123 -12
  17. pyxllib/data/jsonlib.py +89 -0
  18. pyxllib/data/pglib.py +514 -30
  19. pyxllib/data/sqlite.py +231 -4
  20. pyxllib/ext/JLineViewer.py +14 -1
  21. pyxllib/ext/drissionlib.py +277 -0
  22. pyxllib/ext/kq5034lib.py +0 -1594
  23. pyxllib/ext/robustprocfile.py +497 -0
  24. pyxllib/ext/unixlib.py +6 -5
  25. pyxllib/ext/utools.py +108 -95
  26. pyxllib/ext/webhook.py +32 -14
  27. pyxllib/ext/wjxlib.py +88 -0
  28. pyxllib/ext/wpsapi.py +124 -0
  29. pyxllib/ext/xlwork.py +9 -0
  30. pyxllib/ext/yuquelib.py +1003 -71
  31. pyxllib/file/docxlib.py +1 -1
  32. pyxllib/file/libreoffice.py +165 -0
  33. pyxllib/file/movielib.py +9 -0
  34. pyxllib/file/packlib/__init__.py +112 -75
  35. pyxllib/file/pdflib.py +1 -1
  36. pyxllib/file/pupil.py +1 -1
  37. pyxllib/file/specialist/dirlib.py +1 -1
  38. pyxllib/file/specialist/download.py +10 -3
  39. pyxllib/file/specialist/filelib.py +266 -55
  40. pyxllib/file/xlsxlib.py +205 -50
  41. pyxllib/file/xlsyncfile.py +341 -0
  42. pyxllib/prog/cachetools.py +64 -0
  43. pyxllib/prog/filelock.py +42 -0
  44. pyxllib/prog/multiprogs.py +940 -0
  45. pyxllib/prog/newbie.py +9 -2
  46. pyxllib/prog/pupil.py +129 -60
  47. pyxllib/prog/specialist/__init__.py +176 -2
  48. pyxllib/prog/specialist/bc.py +5 -2
  49. pyxllib/prog/specialist/browser.py +11 -2
  50. pyxllib/prog/specialist/datetime.py +68 -0
  51. pyxllib/prog/specialist/tictoc.py +12 -13
  52. pyxllib/prog/specialist/xllog.py +5 -5
  53. pyxllib/prog/xlosenv.py +7 -0
  54. pyxllib/text/airscript.js +744 -0
  55. pyxllib/text/charclasslib.py +17 -5
  56. pyxllib/text/jiebalib.py +6 -3
  57. pyxllib/text/jinjalib.py +32 -0
  58. pyxllib/text/jsa_ai_prompt.md +271 -0
  59. pyxllib/text/jscode.py +159 -4
  60. pyxllib/text/nestenv.py +1 -1
  61. pyxllib/text/newbie.py +12 -0
  62. pyxllib/text/pupil/common.py +26 -0
  63. pyxllib/text/specialist/ptag.py +2 -2
  64. pyxllib/text/templates/echart_base.html +11 -0
  65. pyxllib/text/templates/highlight_code.html +17 -0
  66. pyxllib/text/templates/latex_editor.html +103 -0
  67. pyxllib/text/xmllib.py +76 -14
  68. pyxllib/xl.py +2 -1
  69. pyxllib-0.3.197.dist-info/METADATA +48 -0
  70. pyxllib-0.3.197.dist-info/RECORD +126 -0
  71. {pyxllib-0.3.96.dist-info → pyxllib-0.3.197.dist-info}/WHEEL +1 -2
  72. pyxllib/ext/autogui/__init__.py +0 -8
  73. pyxllib-0.3.96.dist-info/METADATA +0 -51
  74. pyxllib-0.3.96.dist-info/RECORD +0 -333
  75. pyxllib-0.3.96.dist-info/top_level.txt +0 -2
  76. pyxlpr/ai/__init__.py +0 -5
  77. pyxlpr/ai/clientlib.py +0 -1281
  78. pyxlpr/ai/specialist.py +0 -286
  79. pyxlpr/ai/torch_app.py +0 -172
  80. pyxlpr/ai/xlpaddle.py +0 -655
  81. pyxlpr/ai/xltorch.py +0 -705
  82. pyxlpr/data/__init__.py +0 -11
  83. pyxlpr/data/coco.py +0 -1325
  84. pyxlpr/data/datacls.py +0 -365
  85. pyxlpr/data/datasets.py +0 -200
  86. pyxlpr/data/gptlib.py +0 -1291
  87. pyxlpr/data/icdar/__init__.py +0 -96
  88. pyxlpr/data/icdar/deteval.py +0 -377
  89. pyxlpr/data/icdar/icdar2013.py +0 -341
  90. pyxlpr/data/icdar/iou.py +0 -340
  91. pyxlpr/data/icdar/rrc_evaluation_funcs_1_1.py +0 -463
  92. pyxlpr/data/imtextline.py +0 -473
  93. pyxlpr/data/labelme.py +0 -866
  94. pyxlpr/data/removeline.py +0 -179
  95. pyxlpr/data/specialist.py +0 -57
  96. pyxlpr/eval/__init__.py +0 -85
  97. pyxlpr/paddleocr.py +0 -776
  98. pyxlpr/ppocr/__init__.py +0 -15
  99. pyxlpr/ppocr/configs/rec/multi_language/generate_multi_language_configs.py +0 -226
  100. pyxlpr/ppocr/data/__init__.py +0 -135
  101. pyxlpr/ppocr/data/imaug/ColorJitter.py +0 -26
  102. pyxlpr/ppocr/data/imaug/__init__.py +0 -67
  103. pyxlpr/ppocr/data/imaug/copy_paste.py +0 -170
  104. pyxlpr/ppocr/data/imaug/east_process.py +0 -437
  105. pyxlpr/ppocr/data/imaug/gen_table_mask.py +0 -244
  106. pyxlpr/ppocr/data/imaug/iaa_augment.py +0 -114
  107. pyxlpr/ppocr/data/imaug/label_ops.py +0 -789
  108. pyxlpr/ppocr/data/imaug/make_border_map.py +0 -184
  109. pyxlpr/ppocr/data/imaug/make_pse_gt.py +0 -106
  110. pyxlpr/ppocr/data/imaug/make_shrink_map.py +0 -126
  111. pyxlpr/ppocr/data/imaug/operators.py +0 -433
  112. pyxlpr/ppocr/data/imaug/pg_process.py +0 -906
  113. pyxlpr/ppocr/data/imaug/randaugment.py +0 -143
  114. pyxlpr/ppocr/data/imaug/random_crop_data.py +0 -239
  115. pyxlpr/ppocr/data/imaug/rec_img_aug.py +0 -533
  116. pyxlpr/ppocr/data/imaug/sast_process.py +0 -777
  117. pyxlpr/ppocr/data/imaug/text_image_aug/__init__.py +0 -17
  118. pyxlpr/ppocr/data/imaug/text_image_aug/augment.py +0 -120
  119. pyxlpr/ppocr/data/imaug/text_image_aug/warp_mls.py +0 -168
  120. pyxlpr/ppocr/data/lmdb_dataset.py +0 -115
  121. pyxlpr/ppocr/data/pgnet_dataset.py +0 -104
  122. pyxlpr/ppocr/data/pubtab_dataset.py +0 -107
  123. pyxlpr/ppocr/data/simple_dataset.py +0 -372
  124. pyxlpr/ppocr/losses/__init__.py +0 -61
  125. pyxlpr/ppocr/losses/ace_loss.py +0 -52
  126. pyxlpr/ppocr/losses/basic_loss.py +0 -135
  127. pyxlpr/ppocr/losses/center_loss.py +0 -88
  128. pyxlpr/ppocr/losses/cls_loss.py +0 -30
  129. pyxlpr/ppocr/losses/combined_loss.py +0 -67
  130. pyxlpr/ppocr/losses/det_basic_loss.py +0 -208
  131. pyxlpr/ppocr/losses/det_db_loss.py +0 -80
  132. pyxlpr/ppocr/losses/det_east_loss.py +0 -63
  133. pyxlpr/ppocr/losses/det_pse_loss.py +0 -149
  134. pyxlpr/ppocr/losses/det_sast_loss.py +0 -121
  135. pyxlpr/ppocr/losses/distillation_loss.py +0 -272
  136. pyxlpr/ppocr/losses/e2e_pg_loss.py +0 -140
  137. pyxlpr/ppocr/losses/kie_sdmgr_loss.py +0 -113
  138. pyxlpr/ppocr/losses/rec_aster_loss.py +0 -99
  139. pyxlpr/ppocr/losses/rec_att_loss.py +0 -39
  140. pyxlpr/ppocr/losses/rec_ctc_loss.py +0 -44
  141. pyxlpr/ppocr/losses/rec_enhanced_ctc_loss.py +0 -70
  142. pyxlpr/ppocr/losses/rec_nrtr_loss.py +0 -30
  143. pyxlpr/ppocr/losses/rec_sar_loss.py +0 -28
  144. pyxlpr/ppocr/losses/rec_srn_loss.py +0 -47
  145. pyxlpr/ppocr/losses/table_att_loss.py +0 -109
  146. pyxlpr/ppocr/metrics/__init__.py +0 -44
  147. pyxlpr/ppocr/metrics/cls_metric.py +0 -45
  148. pyxlpr/ppocr/metrics/det_metric.py +0 -82
  149. pyxlpr/ppocr/metrics/distillation_metric.py +0 -73
  150. pyxlpr/ppocr/metrics/e2e_metric.py +0 -86
  151. pyxlpr/ppocr/metrics/eval_det_iou.py +0 -274
  152. pyxlpr/ppocr/metrics/kie_metric.py +0 -70
  153. pyxlpr/ppocr/metrics/rec_metric.py +0 -75
  154. pyxlpr/ppocr/metrics/table_metric.py +0 -50
  155. pyxlpr/ppocr/modeling/architectures/__init__.py +0 -32
  156. pyxlpr/ppocr/modeling/architectures/base_model.py +0 -88
  157. pyxlpr/ppocr/modeling/architectures/distillation_model.py +0 -60
  158. pyxlpr/ppocr/modeling/backbones/__init__.py +0 -54
  159. pyxlpr/ppocr/modeling/backbones/det_mobilenet_v3.py +0 -268
  160. pyxlpr/ppocr/modeling/backbones/det_resnet_vd.py +0 -246
  161. pyxlpr/ppocr/modeling/backbones/det_resnet_vd_sast.py +0 -285
  162. pyxlpr/ppocr/modeling/backbones/e2e_resnet_vd_pg.py +0 -265
  163. pyxlpr/ppocr/modeling/backbones/kie_unet_sdmgr.py +0 -186
  164. pyxlpr/ppocr/modeling/backbones/rec_mobilenet_v3.py +0 -138
  165. pyxlpr/ppocr/modeling/backbones/rec_mv1_enhance.py +0 -258
  166. pyxlpr/ppocr/modeling/backbones/rec_nrtr_mtb.py +0 -48
  167. pyxlpr/ppocr/modeling/backbones/rec_resnet_31.py +0 -210
  168. pyxlpr/ppocr/modeling/backbones/rec_resnet_aster.py +0 -143
  169. pyxlpr/ppocr/modeling/backbones/rec_resnet_fpn.py +0 -307
  170. pyxlpr/ppocr/modeling/backbones/rec_resnet_vd.py +0 -286
  171. pyxlpr/ppocr/modeling/heads/__init__.py +0 -54
  172. pyxlpr/ppocr/modeling/heads/cls_head.py +0 -52
  173. pyxlpr/ppocr/modeling/heads/det_db_head.py +0 -118
  174. pyxlpr/ppocr/modeling/heads/det_east_head.py +0 -121
  175. pyxlpr/ppocr/modeling/heads/det_pse_head.py +0 -37
  176. pyxlpr/ppocr/modeling/heads/det_sast_head.py +0 -128
  177. pyxlpr/ppocr/modeling/heads/e2e_pg_head.py +0 -253
  178. pyxlpr/ppocr/modeling/heads/kie_sdmgr_head.py +0 -206
  179. pyxlpr/ppocr/modeling/heads/multiheadAttention.py +0 -163
  180. pyxlpr/ppocr/modeling/heads/rec_aster_head.py +0 -393
  181. pyxlpr/ppocr/modeling/heads/rec_att_head.py +0 -202
  182. pyxlpr/ppocr/modeling/heads/rec_ctc_head.py +0 -88
  183. pyxlpr/ppocr/modeling/heads/rec_nrtr_head.py +0 -826
  184. pyxlpr/ppocr/modeling/heads/rec_sar_head.py +0 -402
  185. pyxlpr/ppocr/modeling/heads/rec_srn_head.py +0 -280
  186. pyxlpr/ppocr/modeling/heads/self_attention.py +0 -406
  187. pyxlpr/ppocr/modeling/heads/table_att_head.py +0 -246
  188. pyxlpr/ppocr/modeling/necks/__init__.py +0 -32
  189. pyxlpr/ppocr/modeling/necks/db_fpn.py +0 -111
  190. pyxlpr/ppocr/modeling/necks/east_fpn.py +0 -188
  191. pyxlpr/ppocr/modeling/necks/fpn.py +0 -138
  192. pyxlpr/ppocr/modeling/necks/pg_fpn.py +0 -314
  193. pyxlpr/ppocr/modeling/necks/rnn.py +0 -92
  194. pyxlpr/ppocr/modeling/necks/sast_fpn.py +0 -284
  195. pyxlpr/ppocr/modeling/necks/table_fpn.py +0 -110
  196. pyxlpr/ppocr/modeling/transforms/__init__.py +0 -28
  197. pyxlpr/ppocr/modeling/transforms/stn.py +0 -135
  198. pyxlpr/ppocr/modeling/transforms/tps.py +0 -308
  199. pyxlpr/ppocr/modeling/transforms/tps_spatial_transformer.py +0 -156
  200. pyxlpr/ppocr/optimizer/__init__.py +0 -61
  201. pyxlpr/ppocr/optimizer/learning_rate.py +0 -228
  202. pyxlpr/ppocr/optimizer/lr_scheduler.py +0 -49
  203. pyxlpr/ppocr/optimizer/optimizer.py +0 -160
  204. pyxlpr/ppocr/optimizer/regularizer.py +0 -52
  205. pyxlpr/ppocr/postprocess/__init__.py +0 -55
  206. pyxlpr/ppocr/postprocess/cls_postprocess.py +0 -33
  207. pyxlpr/ppocr/postprocess/db_postprocess.py +0 -234
  208. pyxlpr/ppocr/postprocess/east_postprocess.py +0 -143
  209. pyxlpr/ppocr/postprocess/locality_aware_nms.py +0 -200
  210. pyxlpr/ppocr/postprocess/pg_postprocess.py +0 -52
  211. pyxlpr/ppocr/postprocess/pse_postprocess/__init__.py +0 -15
  212. pyxlpr/ppocr/postprocess/pse_postprocess/pse/__init__.py +0 -29
  213. pyxlpr/ppocr/postprocess/pse_postprocess/pse/setup.py +0 -14
  214. pyxlpr/ppocr/postprocess/pse_postprocess/pse_postprocess.py +0 -118
  215. pyxlpr/ppocr/postprocess/rec_postprocess.py +0 -654
  216. pyxlpr/ppocr/postprocess/sast_postprocess.py +0 -355
  217. pyxlpr/ppocr/tools/__init__.py +0 -14
  218. pyxlpr/ppocr/tools/eval.py +0 -83
  219. pyxlpr/ppocr/tools/export_center.py +0 -77
  220. pyxlpr/ppocr/tools/export_model.py +0 -129
  221. pyxlpr/ppocr/tools/infer/predict_cls.py +0 -151
  222. pyxlpr/ppocr/tools/infer/predict_det.py +0 -300
  223. pyxlpr/ppocr/tools/infer/predict_e2e.py +0 -169
  224. pyxlpr/ppocr/tools/infer/predict_rec.py +0 -414
  225. pyxlpr/ppocr/tools/infer/predict_system.py +0 -204
  226. pyxlpr/ppocr/tools/infer/utility.py +0 -629
  227. pyxlpr/ppocr/tools/infer_cls.py +0 -83
  228. pyxlpr/ppocr/tools/infer_det.py +0 -134
  229. pyxlpr/ppocr/tools/infer_e2e.py +0 -122
  230. pyxlpr/ppocr/tools/infer_kie.py +0 -153
  231. pyxlpr/ppocr/tools/infer_rec.py +0 -146
  232. pyxlpr/ppocr/tools/infer_table.py +0 -107
  233. pyxlpr/ppocr/tools/program.py +0 -596
  234. pyxlpr/ppocr/tools/test_hubserving.py +0 -117
  235. pyxlpr/ppocr/tools/train.py +0 -163
  236. pyxlpr/ppocr/tools/xlprog.py +0 -748
  237. pyxlpr/ppocr/utils/EN_symbol_dict.txt +0 -94
  238. pyxlpr/ppocr/utils/__init__.py +0 -24
  239. pyxlpr/ppocr/utils/dict/ar_dict.txt +0 -117
  240. pyxlpr/ppocr/utils/dict/arabic_dict.txt +0 -162
  241. pyxlpr/ppocr/utils/dict/be_dict.txt +0 -145
  242. pyxlpr/ppocr/utils/dict/bg_dict.txt +0 -140
  243. pyxlpr/ppocr/utils/dict/chinese_cht_dict.txt +0 -8421
  244. pyxlpr/ppocr/utils/dict/cyrillic_dict.txt +0 -163
  245. pyxlpr/ppocr/utils/dict/devanagari_dict.txt +0 -167
  246. pyxlpr/ppocr/utils/dict/en_dict.txt +0 -63
  247. pyxlpr/ppocr/utils/dict/fa_dict.txt +0 -136
  248. pyxlpr/ppocr/utils/dict/french_dict.txt +0 -136
  249. pyxlpr/ppocr/utils/dict/german_dict.txt +0 -143
  250. pyxlpr/ppocr/utils/dict/hi_dict.txt +0 -162
  251. pyxlpr/ppocr/utils/dict/it_dict.txt +0 -118
  252. pyxlpr/ppocr/utils/dict/japan_dict.txt +0 -4399
  253. pyxlpr/ppocr/utils/dict/ka_dict.txt +0 -153
  254. pyxlpr/ppocr/utils/dict/korean_dict.txt +0 -3688
  255. pyxlpr/ppocr/utils/dict/latin_dict.txt +0 -185
  256. pyxlpr/ppocr/utils/dict/mr_dict.txt +0 -153
  257. pyxlpr/ppocr/utils/dict/ne_dict.txt +0 -153
  258. pyxlpr/ppocr/utils/dict/oc_dict.txt +0 -96
  259. pyxlpr/ppocr/utils/dict/pu_dict.txt +0 -130
  260. pyxlpr/ppocr/utils/dict/rs_dict.txt +0 -91
  261. pyxlpr/ppocr/utils/dict/rsc_dict.txt +0 -134
  262. pyxlpr/ppocr/utils/dict/ru_dict.txt +0 -125
  263. pyxlpr/ppocr/utils/dict/ta_dict.txt +0 -128
  264. pyxlpr/ppocr/utils/dict/table_dict.txt +0 -277
  265. pyxlpr/ppocr/utils/dict/table_structure_dict.txt +0 -2759
  266. pyxlpr/ppocr/utils/dict/te_dict.txt +0 -151
  267. pyxlpr/ppocr/utils/dict/ug_dict.txt +0 -114
  268. pyxlpr/ppocr/utils/dict/uk_dict.txt +0 -142
  269. pyxlpr/ppocr/utils/dict/ur_dict.txt +0 -137
  270. pyxlpr/ppocr/utils/dict/xi_dict.txt +0 -110
  271. pyxlpr/ppocr/utils/dict90.txt +0 -90
  272. pyxlpr/ppocr/utils/e2e_metric/Deteval.py +0 -574
  273. pyxlpr/ppocr/utils/e2e_metric/polygon_fast.py +0 -83
  274. pyxlpr/ppocr/utils/e2e_utils/extract_batchsize.py +0 -87
  275. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_fast.py +0 -457
  276. pyxlpr/ppocr/utils/e2e_utils/extract_textpoint_slow.py +0 -592
  277. pyxlpr/ppocr/utils/e2e_utils/pgnet_pp_utils.py +0 -162
  278. pyxlpr/ppocr/utils/e2e_utils/visual.py +0 -162
  279. pyxlpr/ppocr/utils/en_dict.txt +0 -95
  280. pyxlpr/ppocr/utils/gen_label.py +0 -81
  281. pyxlpr/ppocr/utils/ic15_dict.txt +0 -36
  282. pyxlpr/ppocr/utils/iou.py +0 -54
  283. pyxlpr/ppocr/utils/logging.py +0 -69
  284. pyxlpr/ppocr/utils/network.py +0 -84
  285. pyxlpr/ppocr/utils/ppocr_keys_v1.txt +0 -6623
  286. pyxlpr/ppocr/utils/profiler.py +0 -110
  287. pyxlpr/ppocr/utils/save_load.py +0 -150
  288. pyxlpr/ppocr/utils/stats.py +0 -72
  289. pyxlpr/ppocr/utils/utility.py +0 -80
  290. pyxlpr/ppstructure/__init__.py +0 -13
  291. pyxlpr/ppstructure/predict_system.py +0 -187
  292. pyxlpr/ppstructure/table/__init__.py +0 -13
  293. pyxlpr/ppstructure/table/eval_table.py +0 -72
  294. pyxlpr/ppstructure/table/matcher.py +0 -192
  295. pyxlpr/ppstructure/table/predict_structure.py +0 -136
  296. pyxlpr/ppstructure/table/predict_table.py +0 -221
  297. pyxlpr/ppstructure/table/table_metric/__init__.py +0 -16
  298. pyxlpr/ppstructure/table/table_metric/parallel.py +0 -51
  299. pyxlpr/ppstructure/table/table_metric/table_metric.py +0 -247
  300. pyxlpr/ppstructure/table/tablepyxl/__init__.py +0 -13
  301. pyxlpr/ppstructure/table/tablepyxl/style.py +0 -283
  302. pyxlpr/ppstructure/table/tablepyxl/tablepyxl.py +0 -118
  303. pyxlpr/ppstructure/utility.py +0 -71
  304. pyxlpr/xlai.py +0 -10
  305. /pyxllib/{ext/autogui → autogui}/virtualkey.py +0 -0
  306. {pyxllib-0.3.96.dist-info → pyxllib-0.3.197.dist-info/licenses}/LICENSE +0 -0
@@ -0,0 +1,246 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/10/29
6
+
7
+ import platform
8
+ import sys
9
+ import time
10
+
11
+ import cv2
12
+ import psutil
13
+ import numpy as np
14
+
15
+ if sys.platform == 'win32':
16
+ import win32gui
17
+ import win32process
18
+ # from pywinauto import Desktop
19
+ import uiautomation
20
+
21
+ from pyxllib.prog.cachetools import xlcache
22
+ from pyxllib.cv.xlcvlib import CvImg
23
+ from pyxlpr.ai.clientlib import XlAiClient
24
+
25
+ # 根据平台扩展相应的类
26
+ if platform.system().lower() == "darwin":
27
+ from mss.darwin import MSS as OriginalMSS
28
+ elif platform.system().lower() == "linux":
29
+ from mss.linux import MSS as OriginalMSS
30
+ elif platform.system().lower() == "windows":
31
+ from mss.windows import MSS as OriginalMSS
32
+ else:
33
+ raise RuntimeError("Unsupported platform")
34
+
35
+
36
+ def adjust_monitors(monitors, scale_factor):
37
+ # 调整所有物理显示器的尺寸和位置
38
+ for i in range(1, len(monitors)):
39
+ monitors[i]['width'] = int(monitors[i]['width'] / scale_factor)
40
+ monitors[i]['height'] = int(monitors[i]['height'] / scale_factor)
41
+ monitors[i]['top'] = int(monitors[i]['top'] / scale_factor)
42
+ monitors[i]['left'] = int(monitors[i]['left'] / scale_factor)
43
+
44
+ # 计算虚拟桌面的边界
45
+ left_bound = min(monitor['left'] for monitor in monitors[1:])
46
+ top_bound = min(monitor['top'] for monitor in monitors[1:])
47
+ right_bound = max(monitor['left'] + monitor['width'] for monitor in monitors[1:])
48
+ bottom_bound = max(monitor['top'] + monitor['height'] for monitor in monitors[1:])
49
+
50
+ # 设置虚拟桌面的尺寸和位置
51
+ monitors[0]['width'] = right_bound - left_bound
52
+ monitors[0]['height'] = bottom_bound - top_bound
53
+ monitors[0]['top'] = top_bound
54
+ monitors[0]['left'] = left_bound
55
+
56
+ return monitors
57
+
58
+
59
+ class ActiveWindowCapture(OriginalMSS):
60
+ """
61
+ 基于`MSS`库的一个扩展,用于实现跨平台的多屏幕截图,并添加了以下独特功能:
62
+ 1. 实时窗口捕获:能够获取当前激活的窗口信息,并关联到对应的进程对象。
63
+ 这一特性使得该类在需要实时监控、分析特定应用窗口时尤为实用。
64
+ 2. 缓存机制:该类采用了缓存策略,通过`xlcache`装饰器缓存截取的屏幕和窗口数据,避免频繁重复捕获,提升性能。
65
+ 缓存机制同时确保在多窗口环境中,当前获取的窗口信息是实际的活动窗口,防止数据滞后或错位。
66
+ 3. 多屏幕拼接与坐标调整:支持多屏幕拼接功能,能够调整不同显示器的坐标和尺寸,以生成全屏拼接的截图画布。
67
+ 对于分辨率缩放和多屏偏移,也可以进行自适应调整。
68
+ 4. 标记窗口功能:在截屏时,可以选择性地标记当前激活窗口的位置,支持自定义标记的颜色、厚度和偏移量,便于在截图中直观地显示当前活跃窗口。
69
+
70
+ 适合需要频繁截图、实时监控活动窗口和对应进程的场景,尤其在多屏和分辨率适配方面提供了便捷的解决方案。
71
+ """
72
+
73
+ def __1_动态成员变量(self):
74
+ pass
75
+
76
+ def __init__(self, *, scale=1):
77
+ """
78
+ :param scale: 可适当兼容主屏幕做了缩放处理的情景,但太复杂的情况下也不一定对
79
+ """
80
+ super().__init__()
81
+ self.scale = scale
82
+
83
+ @xlcache(property=True)
84
+ def monitors2(self):
85
+ """ 修正后的各个屏幕坐标 """
86
+ monitors = self.monitors
87
+ if self.scale != 1:
88
+ monitors = adjust_monitors(monitors, self.scale)
89
+ return monitors
90
+
91
+ @xlcache(property=True)
92
+ def window(self):
93
+ """ 当前激活窗口 """
94
+ # 可以小等一会等到有效窗口
95
+ for i in range(4):
96
+ win = uiautomation.GetForegroundControl()
97
+ if win:
98
+ return win
99
+ else:
100
+ time.sleep(0.5)
101
+ return
102
+
103
+ @xlcache(property=True)
104
+ def process(self):
105
+ """ 当前激活窗口 """
106
+ hwnd = self.window.NativeWindowHandle
107
+ thread_id, process_id = win32process.GetWindowThreadProcessId(hwnd)
108
+ return psutil.Process(process_id)
109
+
110
+ @xlcache(property=True)
111
+ def xlapi(self):
112
+ return XlAiClient()
113
+
114
+ def __2_截图数据(self):
115
+ pass
116
+
117
+ @xlcache()
118
+ def _capture_single_monitor(self, order):
119
+ """ 缓存单个屏幕的截图 """
120
+ if order == 0:
121
+ # order=0时,拼接所有屏幕图像。虽然mss其实可以直接提供,但是这样就没有每个屏幕缓存的图片了,还是我自己处理一遍更好。
122
+
123
+ # 计算坐标偏移量,将所有坐标调整至非负
124
+ min_left = min(monitor['left'] for monitor in self.monitors2)
125
+ min_top = min(monitor['top'] for monitor in self.monitors2)
126
+
127
+ # 获取总画布大小(根据所有屏幕的范围计算)
128
+ max_right = max(monitor['left'] + monitor['width'] for monitor in self.monitors2)
129
+ max_bottom = max(monitor['top'] + monitor['height'] for monitor in self.monitors2)
130
+ canvas_width = max_right - min_left
131
+ canvas_height = max_bottom - min_top
132
+
133
+ # 使用numpy创建空白画布 (BGR格式)
134
+ img_canvas = np.zeros((canvas_height, canvas_width, 3), dtype=np.uint8)
135
+
136
+ # 获取并缓存每个子屏幕截图,按调整后的坐标拼接到总画布
137
+ for i in range(1, len(self.monitors2)):
138
+ monitor = self.monitors2[i]
139
+ single_img = self._capture_single_monitor(i) # 获取单屏截图 (cv2格式)
140
+ # 将子屏幕截图粘贴到总画布的指定位置,应用坐标偏移
141
+ x_offset = monitor['left'] - min_left
142
+ y_offset = monitor['top'] - min_top
143
+ img_canvas[y_offset:y_offset + single_img.shape[0],
144
+ x_offset:x_offset + single_img.shape[1]] = single_img
145
+
146
+ img_cv2 = img_canvas
147
+ else:
148
+ if order == -1:
149
+ # 截取当前活动窗口的截图
150
+ active_window = self.window
151
+ rect = active_window.BoundingRectangle
152
+ monitor = {
153
+ 'left': int(rect.left),
154
+ 'top': int(rect.top),
155
+ 'width': int(rect.right - rect.left),
156
+ 'height': int(rect.bottom - rect.top),
157
+ }
158
+ sct_img = self.grab(monitor)
159
+ else:
160
+ sct_img = self.grab(self.monitors2[order])
161
+
162
+ # 将截图的原始数据转换成numpy数组
163
+ img_np = np.frombuffer(sct_img.bgra, dtype=np.uint8)
164
+ img_np = img_np.reshape((sct_img.height, sct_img.width, 4)) # 高、宽、4通道
165
+ # 转换成BGR通道顺序
166
+ img_cv2 = cv2.cvtColor(img_np, cv2.COLOR_BGRA2BGR)
167
+
168
+ return img_cv2
169
+
170
+ def _mark_window_on_screenshot(self, screenshot, window_rect, order=0, mark_params=None):
171
+ """
172
+ 在截图中标记窗口,并根据 order 参数自动调整坐标偏移。
173
+
174
+ :param screenshot: 要标记的截图图像
175
+ :param window_rect: 当前激活窗口的原始坐标 (left, top, right, bottom)
176
+ :param order: 屏幕索引 (0 表示拼接所有屏幕,全图模式)
177
+ :param mark_params: 标记参数字典,包含 color, base, thickness 等
178
+ :return: 标记后的截图
179
+ """
180
+ # 1 设定默认标记参数,若传入 mark_params 则进行更新
181
+ default_params = {
182
+ "color": (0, 255, 0), # 默认绿色
183
+ "base": 10, # 默认缩进 10 像素
184
+ "thickness": 3 # 默认厚度 3 像素
185
+ }
186
+ mark_params = mark_params if isinstance(mark_params, dict) else None
187
+ if mark_params:
188
+ default_params.update(mark_params)
189
+
190
+ color = default_params["color"]
191
+ base = default_params["base"]
192
+ thickness = default_params["thickness"]
193
+
194
+ # 2 获取对应 order 的屏幕原点坐标进行偏差修正
195
+ if order == 0:
196
+ origin_x = self.monitors2[0]['left']
197
+ origin_y = self.monitors2[0]['top']
198
+ else:
199
+ origin_x = self.monitors2[order]['left']
200
+ origin_y = self.monitors2[order]['top']
201
+
202
+ # 计算相对于指定屏幕或全图的窗口坐标
203
+ adjusted_coords = (
204
+ int(window_rect.left) - origin_x,
205
+ int(window_rect.top) - origin_y,
206
+ int(window_rect.right) - origin_x,
207
+ int(window_rect.bottom) - origin_y,
208
+ )
209
+
210
+ # 3 绘制矩形标记
211
+ cv2.rectangle(
212
+ screenshot,
213
+ (adjusted_coords[0] + base, adjusted_coords[1] + base),
214
+ (adjusted_coords[2] - base, adjusted_coords[3] - base),
215
+ color, # 使用自定义颜色
216
+ thickness # 使用自定义厚度
217
+ )
218
+
219
+ return screenshot
220
+
221
+ @xlcache()
222
+ def screenshot(self, order=0, *, to_pil=False, mark_active_window=False):
223
+ """ 截屏
224
+
225
+ :param int order:
226
+ -1, 截取当前激活窗口
227
+ 0,默认值,截取全部屏幕
228
+ 1,截取第1个屏幕
229
+ 2,截取第2个屏幕
230
+ ...
231
+ :param to_pil: 是否转换成 PIL 格式
232
+ :param mark_active_window: 是否标记当前激活窗口,若为字典可设置颜色、厚度等参数
233
+ :return: np矩阵或PIL图片,取决于to_cv2参数
234
+ """
235
+ assert order < len(self.monitors), '屏幕下标越界'
236
+ img = self._capture_single_monitor(order) # 调用子函数处理所有屏幕拼接
237
+
238
+ # 若需要标记当前激活窗口
239
+ if mark_active_window:
240
+ img = self._mark_window_on_screenshot(img, self.window.BoundingRectangle, order,
241
+ mark_params=mark_active_window)
242
+
243
+ if to_pil:
244
+ img = CvImg.read(img).to_pil_image() # 转成pil矩阵格式
245
+
246
+ return img
pyxllib/autogui/all.py ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # @Author : 陈坤泽
4
+ # @Email : 877362867@qq.com
5
+ # @Date : 2024/10/29
6
+
7
+ from pyxllib.autogui.autogui import *
8
+ from pyxllib.autogui.virtualkey import *
9
+ from pyxllib.autogui.activewin import *
@@ -3,17 +3,8 @@
3
3
  # @Author : 陈坤泽
4
4
  # @Email : 877362867@qq.com
5
5
  # @Date : 2020/06/06
6
- import sys
7
-
8
- from pyxllib.prog.pupil import check_install_package
9
-
10
- if sys.platform == 'win32':
11
- check_install_package('pyautogui')
12
-
13
- check_install_package('keyboard')
14
- check_install_package('klembord')
15
- check_install_package('mss') # 多屏幕截图
16
6
 
7
+ import sys
17
8
  from collections import defaultdict
18
9
  import json
19
10
  import os
@@ -26,6 +17,7 @@ from pandas.api.types import is_list_like
26
17
 
27
18
  if sys.platform == 'win32':
28
19
  import pyautogui
20
+ import win32gui
29
21
 
30
22
  try:
31
23
  import pyscreeze # NOQA pyautogui安装的时候会自动安装依赖的pyscreeze
@@ -35,13 +27,17 @@ except ModuleNotFoundError:
35
27
  from pyxllib.prog.newbie import first_nonnone, round_int
36
28
  from pyxllib.prog.pupil import xlwait, DictTool, check_install_package
37
29
  from pyxllib.prog.specialist import TicToc
38
- from pyxllib.algo.geo import ComputeIou, ltrb2xywh, xywh2ltrb
30
+ from pyxllib.algo.geo import ComputeIou, ltrb2xywh, xywh2ltrb, ltrb2polygon
39
31
  from pyxllib.algo.shapelylib import ShapelyPolygon
40
32
  from pyxllib.file.specialist import File, Dir, XlPath
41
33
  from pyxllib.cv.expert import xlcv, xlpil
42
34
  from pyxlpr.data.labelme import LabelmeDict
43
35
 
44
36
 
37
+ def __20210531():
38
+ """ 以前设想的一个跟labelme结合的自动化操作类 """
39
+
40
+
45
41
  class AutoGuiLabelData:
46
42
  """ AutoGuiLabelData """
47
43
 
@@ -773,6 +769,9 @@ def grab_monitor(order=0, to_cv2=True):
773
769
  1,截取第1个屏幕
774
770
  2,截取第2个屏幕
775
771
  ...
772
+ :param to_cv2:
773
+ True, 转成cv2格式的图片
774
+ False, 使用pil格式的图片
776
775
  """
777
776
  from PIL import Image
778
777
  from pyxllib.xlcv import PilImg
@@ -817,6 +816,36 @@ def list_windows(mode=1):
817
816
  return ls
818
817
 
819
818
 
819
+ class UiTracePath:
820
+ """ 在window窗口上用鼠标勾画路径 """
821
+
822
+ @classmethod
823
+ def from_polygon(cls, points, duration_per_circle=3, num_circles=1):
824
+ """
825
+ 让鼠标顺时针围绕任意多边形移动。
826
+
827
+ :param points: 多边形顶点的坐标列表,按顺时针或逆时针顺序排列
828
+ :param duration_per_circle: 每圈耗时
829
+ :param num_circles: 总圈数
830
+ """
831
+ num_points = len(points)
832
+ segment_duration = duration_per_circle / num_points # 每条边的耗时
833
+
834
+ for _ in range(num_circles):
835
+ # 顺时针移动鼠标
836
+ for i in range(num_points):
837
+ start = points[i]
838
+ pyautogui.moveTo(start[0], start[1])
839
+ end = points[(i + 1) % num_points]
840
+ # 使用 moveTo 的 duration 参数控制每条边的移动时间
841
+ pyautogui.moveTo(end[0], end[1], duration=segment_duration)
842
+
843
+ @classmethod
844
+ def from_ltrb(cls, ltrb, **kwargs):
845
+ points = ltrb2polygon(ltrb)
846
+ return cls.from_polygon(points, **kwargs)
847
+
848
+
820
849
  if __name__ == '__main__':
821
850
  with TicToc(__name__):
822
851
  agld = AutoGuiLabelData(r'D:\slns\py4101\py4101\touhou\label')