PyClickerRPA 0.1.0__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.
- autoclicker/__init__.py +14 -0
- autoclicker/app.py +21 -0
- autoclicker/capture.py +94 -0
- autoclicker/clicker.py +212 -0
- autoclicker/dpi.py +30 -0
- autoclicker/gui/__init__.py +1 -0
- autoclicker/gui/flow_connection.py +91 -0
- autoclicker/gui/flow_editor.py +340 -0
- autoclicker/gui/flow_node.py +107 -0
- autoclicker/gui/hotkeys.py +40 -0
- autoclicker/gui/main_window.py +651 -0
- autoclicker/gui/monitor.py +84 -0
- autoclicker/gui/preview_label.py +176 -0
- autoclicker/gui/qt_runner.py +71 -0
- autoclicker/gui/recorder.py +163 -0
- autoclicker/gui/scheduler_widget.py +160 -0
- autoclicker/gui/snippet_library.py +117 -0
- autoclicker/gui/task_widget.py +547 -0
- autoclicker/matcher.py +152 -0
- autoclicker/models.py +468 -0
- autoclicker/ocr.py +63 -0
- autoclicker/run.py +64 -0
- autoclicker/runner.py +666 -0
- autoclicker/windows.py +53 -0
- pyclickerrpa-0.1.0.dist-info/METADATA +90 -0
- pyclickerrpa-0.1.0.dist-info/RECORD +29 -0
- pyclickerrpa-0.1.0.dist-info/WHEEL +5 -0
- pyclickerrpa-0.1.0.dist-info/entry_points.txt +5 -0
- pyclickerrpa-0.1.0.dist-info/top_level.txt +1 -0
autoclicker/windows.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Enumerate top-level windows — port of windowselector.cpp.
|
|
2
|
+
|
|
3
|
+
Lists visible windows that have a title and a non-empty client area.
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
try:
|
|
11
|
+
import win32gui
|
|
12
|
+
_HAS_WIN32 = True
|
|
13
|
+
except ImportError:
|
|
14
|
+
_HAS_WIN32 = False
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class WindowInfo:
|
|
19
|
+
hwnd: int = 0
|
|
20
|
+
title: str = ""
|
|
21
|
+
width: int = 0
|
|
22
|
+
height: int = 0
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def list_windows() -> list[WindowInfo]:
|
|
26
|
+
"""All visible, titled, non-zero-size top-level windows."""
|
|
27
|
+
if not _HAS_WIN32:
|
|
28
|
+
return []
|
|
29
|
+
result: list[WindowInfo] = []
|
|
30
|
+
|
|
31
|
+
def _enum(hwnd, _):
|
|
32
|
+
if not win32gui.IsWindowVisible(hwnd):
|
|
33
|
+
return
|
|
34
|
+
title = win32gui.GetWindowText(hwnd)
|
|
35
|
+
if not title:
|
|
36
|
+
return
|
|
37
|
+
left, top, right, bottom = win32gui.GetClientRect(hwnd)
|
|
38
|
+
w, h = right - left, bottom - top
|
|
39
|
+
if w <= 0 or h <= 0:
|
|
40
|
+
return
|
|
41
|
+
result.append(WindowInfo(hwnd=hwnd, title=title, width=w, height=h))
|
|
42
|
+
|
|
43
|
+
win32gui.EnumWindows(_enum, None)
|
|
44
|
+
return result
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def find_by_title(title: str) -> Optional[WindowInfo]:
|
|
48
|
+
"""First window whose title contains *title* (case-insensitive)."""
|
|
49
|
+
t = title.lower()
|
|
50
|
+
for w in list_windows():
|
|
51
|
+
if t in w.title.lower():
|
|
52
|
+
return w
|
|
53
|
+
return None
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: PyClickerRPA
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Visual auto-click / RPA tool: window capture, OpenCV image matching, OCR, a node flow editor and step-list editor, recorder, scheduler and triggers (Windows).
|
|
5
|
+
Author: Equinox
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Equinox/PyClickerRPA
|
|
8
|
+
Keywords: autoclicker,rpa,automation,opencv,template-matching,ocr,gui,windows
|
|
9
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
10
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Topic :: Desktop Environment
|
|
13
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
Requires-Dist: numpy>=1.23
|
|
17
|
+
Requires-Dist: opencv-python>=4.8
|
|
18
|
+
Requires-Dist: pywin32>=305; sys_platform == "win32"
|
|
19
|
+
Requires-Dist: pynput>=1.7
|
|
20
|
+
Requires-Dist: PySide6>=6.5
|
|
21
|
+
Provides-Extra: ocr
|
|
22
|
+
Requires-Dist: paddleocr>=2.7; extra == "ocr"
|
|
23
|
+
Requires-Dist: paddlepaddle>=2.5; extra == "ocr"
|
|
24
|
+
|
|
25
|
+
# PyClickerRPA
|
|
26
|
+
|
|
27
|
+
A visual auto-click / RPA tool for Windows — window/screen capture, OpenCV
|
|
28
|
+
template matching, optional OCR, a node-based flow editor **and** a linear
|
|
29
|
+
step-list editor, an action recorder, a scheduler, and image/color triggers.
|
|
30
|
+
|
|
31
|
+
It is a Python/PySide6 port of a Qt/C++ AutoClicker, and reads/writes the same
|
|
32
|
+
`.json` task format.
|
|
33
|
+
|
|
34
|
+
## Install
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
pip install PyClickerRPA
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Optional OCR (find-text / read-text steps) needs PaddleOCR:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
pip install "PyClickerRPA[ocr]"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Run
|
|
47
|
+
|
|
48
|
+
GUI:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
autoclicker
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Headless (run a saved task against a window by title, or the whole screen):
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
autoclicker-run task.json --window "Notepad"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Features
|
|
61
|
+
|
|
62
|
+
- **Targeting**: pick any visible window (or the whole screen); background-window
|
|
63
|
+
capture via `PrintWindow`.
|
|
64
|
+
- **Matching**: OpenCV `TM_CCOEFF_NORMED` template matching (multi-scale, ROI,
|
|
65
|
+
multi-target), pixel-color checks, and optional PaddleOCR text find / read.
|
|
66
|
+
- **Editors**: drag-and-drop **node flow graph** (back-edges become loops) and a
|
|
67
|
+
**step list** with a full per-step parameter dialog; both interoperate.
|
|
68
|
+
- **~30+ step types**: click image/text/position, click-all, relative & offset
|
|
69
|
+
clicks, wait / random wait, drag / long-press / pinch / scroll, key / type /
|
|
70
|
+
hotkey, loop / goto / while / do-until, if image/text/color/count/var, set-var
|
|
71
|
+
(`++`/`--`, `last_x/last_y/last_text`), read-text→variable, call sub-task,
|
|
72
|
+
groups.
|
|
73
|
+
- **Authoring aids**: action recorder (global hooks), snippet library, task
|
|
74
|
+
packages (`.zip` with templates), edit-on-preview coordinate picking,
|
|
75
|
+
template crop / color pick, single-step test run.
|
|
76
|
+
- **Runtime**: live variables panel, hit markers on the preview, screenshot on
|
|
77
|
+
failure, retry / repeat / until policies.
|
|
78
|
+
- **Automation**: global hotkeys (F6 run/stop, ESC stop), scheduler, and a
|
|
79
|
+
monitor/trigger mode (run a task when an image/color appears) with tray icon.
|
|
80
|
+
- **Correctness**: multi-monitor + high-DPI aware coordinates.
|
|
81
|
+
|
|
82
|
+
## Notes
|
|
83
|
+
|
|
84
|
+
- **Windows only** (uses Win32 for capture and `SendInput`).
|
|
85
|
+
- OCR's first run downloads PaddleOCR models (~100 MB).
|
|
86
|
+
- Some target windows may require running as administrator.
|
|
87
|
+
|
|
88
|
+
## License
|
|
89
|
+
|
|
90
|
+
MIT
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
autoclicker/__init__.py,sha256=vAohxUGXGksnw0UzCk9VIQaX1DmrNxQXD4WermvPN2c,480
|
|
2
|
+
autoclicker/app.py,sha256=dpuxXb9ZMj2iYszOoDKzGRZSF-sBy5WtIti7T3nK39c,438
|
|
3
|
+
autoclicker/capture.py,sha256=S64ri2dRFy474ByScst4ggnKUnFllHuae1if3ZirPNE,3285
|
|
4
|
+
autoclicker/clicker.py,sha256=k3v0VH30BUKwu70CvSu_mG5Gqpk6hpRuc-dJreUsBFo,7678
|
|
5
|
+
autoclicker/dpi.py,sha256=rslTkJQUUcm7p9hoOqUjr7TVjGJDOKLE4V9-ZhfnsMw,817
|
|
6
|
+
autoclicker/matcher.py,sha256=DciexW8AGRVwj9ny4-mydmet_iEoEEVzzGS4CpX9N48,4986
|
|
7
|
+
autoclicker/models.py,sha256=detQO5z-58ioN6f24cyC5cirNQqKtgLYTiBh-IOgnrI,18323
|
|
8
|
+
autoclicker/ocr.py,sha256=wqe8MDR8fg6RBuc8uvU82b6fCNxsk1mMHJW-5h66wAg,1858
|
|
9
|
+
autoclicker/run.py,sha256=-EXt76-8bFaa6TVWG_u9zzE9hGOK9YoUfDyGch5SFsM,1925
|
|
10
|
+
autoclicker/runner.py,sha256=Py_bx9_AUkTbTSd1KVp48L8DZAXJs_CwkViidpaHmzk,29388
|
|
11
|
+
autoclicker/windows.py,sha256=fzZFIKhxkPfG5cuX-Fz5XecKk2HPXskTLP-a-fkKSmI,1330
|
|
12
|
+
autoclicker/gui/__init__.py,sha256=6KAjm7qpdocLpM1l8nZYIx1rZgK9ImEUFCYfZFdIYlw,46
|
|
13
|
+
autoclicker/gui/flow_connection.py,sha256=D0u6ghKyzLFLXqNvMO3c6D8Br8h8cOtkB9LFaRMoZzc,3493
|
|
14
|
+
autoclicker/gui/flow_editor.py,sha256=2vScnbiRhCn8Qz4UGSSaRTUZ2eOe1HP3wthk-LU6izE,13858
|
|
15
|
+
autoclicker/gui/flow_node.py,sha256=Hg0tN24e8yqBb5ONZhtn4VozYdi5_ErNuJb7TlzLO-w,3666
|
|
16
|
+
autoclicker/gui/hotkeys.py,sha256=JwVXIlrp1efDV3is82TdGSIp3IeXNM6BQJcWq8MGRxo,1080
|
|
17
|
+
autoclicker/gui/main_window.py,sha256=N6wofxKPmps_wBSPUJ83bfY7_-rVJmOkc34rRMdP_Lo,26455
|
|
18
|
+
autoclicker/gui/monitor.py,sha256=ExJND70mSXuDz3K3Oksi-emy9lEyDjRCDjD8gzlAbgE,2718
|
|
19
|
+
autoclicker/gui/preview_label.py,sha256=-EkTQOBQFkNQzd47PEbekgAURaY-XsNmGog0LK5Y-n8,6844
|
|
20
|
+
autoclicker/gui/qt_runner.py,sha256=BA4brSx76oCauYyOrRS-Xrqd8ZUiDFCca69BlT7ODIc,2226
|
|
21
|
+
autoclicker/gui/recorder.py,sha256=42ETyq5P-ubKev6DJLI7_Vq9sWO7I_EcR3-f0Z-E84I,5597
|
|
22
|
+
autoclicker/gui/scheduler_widget.py,sha256=Co-bFN57yae3czkg552mruiCIAS_o0LpwmJyEayrVJY,5694
|
|
23
|
+
autoclicker/gui/snippet_library.py,sha256=uHXe0kfOFHM6jS4DKy-rCNaoqr1syJlxSiQ8BXkiNgE,4064
|
|
24
|
+
autoclicker/gui/task_widget.py,sha256=vM6KOrw4C3RkkNlemIQcqeBHO7t6M5ksQMc41m72UJc,22846
|
|
25
|
+
pyclickerrpa-0.1.0.dist-info/METADATA,sha256=wN1vP5tCYQVQxTRstedLfFALsbNFDpwrLyitRB1jBGc,3254
|
|
26
|
+
pyclickerrpa-0.1.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
|
|
27
|
+
pyclickerrpa-0.1.0.dist-info/entry_points.txt,sha256=DpVqGDQGRWjNHztPPPKEYJpEiquk_z0ENzSx2RYE4Hc,107
|
|
28
|
+
pyclickerrpa-0.1.0.dist-info/top_level.txt,sha256=f4z06wMjJB6EHaRE44t5VT7fUsFkfeY1Qj6z0rT8__M,12
|
|
29
|
+
pyclickerrpa-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
autoclicker
|