📐 relative-position — 跨平台 UI 元素相对定位库
"相对于窗口定位元素,告别手动像素计算。"
概述
relative-position 是一个跨平台 Python 库,用于在桌面应用程序中程序化地定位和操作 UI 元素。核心思想是定义 UI 元素相对于其父窗口的位置(使用如"左上角"、"右下角"等参考点),库自动计算出屏幕绝对坐标,然后执行点击、双击、右键、悬停等操作——无需手动计算像素坐标。
GitHub: https://github.com/mikigo/relative-position
PyPI: https://pypi.org/project/relative-position/
解决的痛点
- GUI 自动化中需要手动计算屏幕绝对坐标,繁琐且易出错
- 窗口位置变化后坐标失效,缺乏相对定位能力
- 跨平台 GUI 操作 API 不统一,写一套代码需要适配多个平台
- 元素定位逻辑与业务逻辑耦合,代码难以维护和复用
核心特性
九方向定位参考点
元素可基于窗口的 9 个参考点进行相对定位:
两种元素定义方式
- bbox(包围盒):
[x偏移, y偏移, 宽度, 高度]— 定义元素的矩形区域 - center(中心点):
[x偏移, y偏移]— 直接从参考点偏移
自动坐标计算
定位过程:
- 根据元素名查找元素配置
- 从窗口信息提供器获取窗口的屏幕绝对坐标
- 基于参考点偏移计算元素绝对位置
- bbox 模式下计算矩形中心点作为操作目标
鼠标操作
计算出元素中心坐标后,通过 pyautogui 执行:
多元素管理
使用 Elements 类批量管理多个元素,支持字典式访问:
窗口操作
跨平台支持
平台在导入时自动检测,用户只需传入应用名称,无需关心底层实现。
技术栈
项目结构
架构设计
三层分层架构
- 公开 API 层(
app.py、elements.py)— 用户面向的App、Ele、Direction、Mouse、Elements类 - 平台抽象层(
linux/base.py)—RelativePositionBase抽象基类,定义窗口/元素定位接口 - 平台实现层(
linux/main.py、windows/main.py)— 具体平台实现,调用各自的窗口信息提供器
设计模式
平台检测逻辑
使用方式
安装
基本用法
批量管理元素
独立鼠标操作
设计特点
- 程序化定义:元素作为 Python 对象定义,非配置文件,享受 IDE 自动补全和类型检查
- 运行时平台检测:导入时自动检测 Windows / Linux X11 / Linux Wayland
- 类型安全的枚举方向:
Direction枚举提供自动补全,同时兼容字符串值 - 重试机制:Linux 和 Windows 实现均支持窗口信息获取重试(可配置
retry参数) - Wayland 限制:Wayland 协议下
focus_window()为空操作,仅 Deepin 桌面完整支持
许可证
Apache 2.0
声明:本站所有文章,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。-- mikigo