diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..eb62f1f --- /dev/null +++ b/404.html @@ -0,0 +1,664 @@ + + + +
+ + + + + + + + + + + + + + + + +自动化操作的核心类,提供鼠标、键盘模拟和屏幕捕获功能。
+from watchcat import Automation
+
+auto = Automation()
+auto.click(100, 200)
+auto.type_text("Hello World")
+
click(self, x: int, y: int, button: str = "left")
在指定位置执行鼠标点击。
+参数:
+- x
: 横坐标
+- y
: 纵坐标
+- button
: 鼠标按键 ("left", "right", "middle")
double_click(self, x: int, y: int)
在指定位置执行双击。
+参数:
+- x
: 横坐标
+- y
: 纵坐标
move_to(self, x: int, y: int, duration: float = 0)
移动鼠标到指定位置。
+参数:
+- x
: 横坐标
+- y
: 纵坐标
+- duration
: 移动持续时间(秒)
drag_to(self, start_x: int, start_y: int, end_x: int, end_y: int, duration: float = 0.5)
执行拖拽操作。
+参数:
+- start_x
: 起始横坐标
+- start_y
: 起始纵坐标
+- end_x
: 结束横坐标
+- end_y
: 结束纵坐标
+- duration
: 拖拽持续时间(秒)
type_text(self, text: str, interval: float = 0)
模拟键盘输入文本。
+参数:
+- text
: 要输入的文本
+- interval
: 按键间隔(秒)
key_press(self, key: str)
按下指定按键。
+参数:
+- key
: 按键名称
key_release(self, key: str)
释放指定按键。
+参数:
+- key
: 按键名称
hotkey(self, *keys: str)
执行组合键。
+参数:
+- keys
: 按键序列
screenshot(self, region: tuple = None) -> Image
截取屏幕区域。
+参数:
+- region
: 截图区域 (x, y, width, height)
返回: +- PIL Image对象
+locate_on_screen(self, image_path: str, confidence: float = 0.9) -> tuple
在屏幕上查找图像。
+参数:
+- image_path
: 图像文件路径
+- confidence
: 匹配置信度
返回: +- 匹配位置 (x, y)
+from watchcat import Automation
+from watchcat.utils import sleep
+
+auto = Automation()
+
+# 移动鼠标
+auto.move_to(100, 100, duration=1)
+
+# 点击
+auto.click(100, 100)
+
+# 等待
+sleep(1)
+
+# 输入文本
+auto.type_text("Hello World")
+
+# 按组合键
+auto.hotkey("ctrl", "a")
+auto.hotkey("ctrl", "c")
+
from watchcat import Automation
+
+auto = Automation()
+
+# 查找图像位置
+pos = auto.locate_on_screen("button.png")
+if pos:
+ x, y = pos
+ auto.click(x, y)
+
+# 截图并保存
+screenshot = auto.screenshot()
+screenshot.save("screen.png")
+
from watchcat import Automation
+from watchcat.utils import sleep
+
+class LoginAutomation(Automation):
+ def __init__(self, username: str, password: str):
+ super().__init__()
+ self.username = username
+ self.password = password
+
+ def run(self):
+ # 找到登录按钮
+ login_btn = self.locate_on_screen("login_button.png")
+ if not login_btn:
+ raise Exception("找不到登录按钮")
+
+ # 点击登录按钮
+ self.click(*login_btn)
+ sleep(1)
+
+ # 输入用户名
+ self.type_text(self.username)
+ self.key_press("tab")
+
+ # 输入密码
+ self.type_text(self.password)
+
+ # 提交
+ self.key_press("enter")
+
+ # 等待登录完成
+ sleep(2)
+
+ # 验证登录结果
+ if self.locate_on_screen("login_success.png"):
+ print("登录成功")
+ else:
+ print("登录失败")
+
+# 使用示例
+auto = LoginAutomation("user", "pass")
+auto.run()
+
y轴向下为正
+性能优化
+duration
参数可以使动作更自然sleep
可以提高可靠性图像识别操作较慢,建议缓存结果
+错误处理
+主要的窗口类,用于创建和管理透明覆盖窗口。
+属性 | +类型 | +描述 | +
---|---|---|
opacity |
+float | +窗口透明度 (0.0-1.0) | +
click_through |
+bool | +是否允许点击穿透 | +
always_on_top |
+bool | +是否总是置顶 | +
geometry |
+QRect | +窗口几何属性 | +
__init__(self, parent=None)
创建一个新的窗口实例。
+参数:
+- parent
: 父窗口对象(可选)
show(self)
显示窗口。
+hide(self)
隐藏窗口。
+set_opacity(self, value: float)
设置窗口透明度。
+参数:
+- value
: 透明度值 (0.0-1.0)
set_click_through(self, enabled: bool)
设置是否允许点击穿透。
+参数:
+- enabled
: 是否启用点击穿透
set_always_on_top(self, enabled: bool)
设置窗口是否总是置顶。
+参数:
+- enabled
: 是否启用置顶
add_widget(self, widget, x: int = 0, y: int = 0)
向窗口添加控件。
+参数:
+- widget
: Qt控件对象
+- x
: 横坐标位置
+- y
: 纵坐标位置
信号 | +参数 | +描述 | +
---|---|---|
opacity_changed |
+float | +透明度改变时触发 | +
click_through_changed |
+bool | +点击穿透状态改变时触发 | +
geometry_changed |
+QRect | +窗口几何属性改变时触发 | +
from watchcat import Window
+from PyQt6.QtWidgets import QPushButton, QLabel
+from PyQt6.QtCore import Qt
+
+class MyWindow(Window):
+ def __init__(self):
+ super().__init__()
+
+ # 设置窗口属性
+ self.set_opacity(0.8)
+ self.set_click_through(False)
+ self.set_always_on_top(True)
+
+ # 添加按钮
+ button = QPushButton("点击", self)
+ self.add_widget(button, 10, 10)
+
+ # 添加标签
+ label = QLabel("Hello", self)
+ label.setStyleSheet("color: white;")
+ self.add_widget(label, 10, 50)
+
+ # 连接信号
+ self.opacity_changed.connect(self.on_opacity_changed)
+
+ def on_opacity_changed(self, value):
+ print(f"透明度改变为: {value}")
+
+# 使用示例
+window = MyWindow()
+window.show()
+
window.setStyleSheet("""
+ QWidget {
+ background-color: rgba(0, 0, 0, 180);
+ border: 1px solid #00ff00;
+ border-radius: 5px;
+ }
+
+ QPushButton {
+ background-color: #00ff00;
+ color: black;
+ border: none;
+ padding: 5px;
+ border-radius: 3px;
+ }
+
+ QPushButton:hover {
+ background-color: #33ff33;
+ }
+
+ QLabel {
+ color: #00ff00;
+ font-family: 'Consolas';
+ }
+""")
+
class BorderlessWindow(Window):
+ def __init__(self):
+ super().__init__()
+ self.setWindowFlag(Qt.FramelessWindowHint)
+
+ def mousePressEvent(self, event):
+ if event.button() == Qt.LeftButton:
+ self.drag_position = event.globalPos() - self.frameGeometry().topLeft()
+
+ def mouseMoveEvent(self, event):
+ if event.buttons() == Qt.LeftButton:
+ self.move(event.globalPos() - self.drag_position)
+