Skip to main content

relative-position

告别那些繁琐的坐标计算!用 Python 轻松找到桌面应用中元素的准确位置 🎯

✨ 特性

relative-position 是一个让窗口元素定位变得简单有趣的跨平台 Python 库。它就像给你的鼠标装上了 GPS 导航系统:

  • 🎯 精准定位:告别手动计算像素,让代码帮你找到元素
  • 🌍 跨平台支持:Linux (X11/Wayland) 和 Windows 全覆盖,一个库走天下
  • 🎮 游戏化配置:用代码定义 UI 元素,像玩游戏一样简单
  • 🔧 智能参考点:支持 9 种参考点方向,满足各种布局需求
  • 🤖 自动适配:智能识别当前平台,加载最优实现

🚀 快速开始

安装

pip install relative-position

或者从源码安装(适合喜欢折腾的开发者):

git clone https://github.com/mikigo/relative-position.git
cd relative-position
pip install -e .

📚 使用指南

窥探窗口信息

想知道当前电脑上都有哪些窗口?一秒钟搞定:

from relative_position import get_window_info_provider

# 自动识别平台,获取对应的窗口信息提供者
provider = get_window_info_provider()

# 获取所有窗口信息(这比侦探调查还快)
windows = provider.window_info()
for name, info in windows.items():
    print(f"发现目标: {name}")
    print(f"📍 位置: {info['location']}")

使用 Ele 类定义元素(推荐)

告别古老的 INI 文件,用代码定义元素,就像写诗一样优雅:

from relative_position import Ele, Elements, get_button_center

# 定义一个元素(就像定义你的好朋友)
close_button = Ele(
    direction="left_bottom",  # 参考点方向
    location=[20, 20, 50, 35]  # x, y, width, height
)

# 或者一次定义多个元素(就像组建一个梦之队)
elements = Elements()
elements.add("close_button", close_button)
elements.add("open_button", Ele(direction="right_top", location=[10, 10, 40, 30]))
elements.add("menu_item", Ele(direction="left_top", location=[100, 200, 80, 40]))

# 使用元素集合
btn_center = get_button_center(
    app_name="notepad.exe",  # Windows 用户
    # app_name="gedit",      # Linux 用户
    config_path=elements      # 直接传入 Elements 对象
)

# 获取元素坐标(比找宝藏还准)
x, y = btn_center.btn_center("close_button")
print(f"🎯 close_button 瞄准点: ({x}, {y})")

# 获取窗口信息
window_x, window_y = btn_center.window_left_top_position()
width, height = btn_center.window_sizes()
print(f"📐 窗口位置: ({window_x}, {window_y})")
print(f"📏 窗口大小: {width} x {height}")

支持的配置方式

我们支持多种配置方式,总有一款适合你:

  • Ele 对象:单个元素定义(最灵活)
  • Elements 对象:元素集合管理(推荐)
  • 字典配置:数据驱动(适合配置管理系统)
  • INI 文件:已不再支持(拥抱代码定义吧!)

🎨 参考点方向 (direction)

就像选择最佳的观察角度一样,我们提供了 9 种参考点方向:

方向 说明 适用场景
left_top 左上角 传统的左上定位
right_top 右上角 适合右上角按钮
left_bottom 左下角 底部左侧元素
right_bottom 右下角 底部右侧元素
top_center 上边界中心 顶部中间按钮
bottom_center 下边界中心 底部中间按钮
left_center 左边界中心 左侧中间元素
right_center 右边界中心 右侧中间元素
window_size 整个窗口 窗口级别操作

🏗️ API 参考

Ele 类

元素定义的核心类,让你的 UI 元素定义变得有型:

close_button = Ele(
    direction="left_bottom",
    location=[20, 20, 50, 35]
)

属性

  • direction: 参考点方向
  • location: 坐标列表 [x, y, width, height]
  • x, y, width, height: 便捷属性访问器

Elements 类

元素集合管理器,让你像管理团队一样管理多个元素:

elements = Elements()
elements.add("close_button", Ele(...))
elements.add("open_button", Ele(...))

# 像字典一样访问
element = elements["close_button"]

# 遍历所有元素
for name in elements:
    print(f"{name}: {elements[name]}")

方法

  • add(name, ele): 添加元素
  • get(name): 获取元素
  • remove(name): 移除元素
  • list_names(): 获取所有元素名称
  • to_dict(): 转换为字典

ButtonCenter 类

元素定位的主力军,提供丰富的窗口和元素操作方法:

窗口定位方法

  • window_left_top_position(): 获取窗口左上角坐标
  • window_right_top_position(): 获取窗口右上角坐标
  • window_left_bottom_position(): 获取窗口左下角坐标
  • window_right_bottom_position(): 获取窗口右下角坐标
  • window_center(): 获取窗口中心坐标
  • window_sizes(): 获取窗口大小
  • window_location_and_sizes(): 获取窗口位置和大小

元素定位方法

  • btn_center(btn_name, ...): 获取指定按钮的中心坐标
  • btn_size(btn_name, ...): 获取指定按钮的大小和位置
  • btn_info(btn_name): 获取元素的相对位置和参考系

窗口管理方法

  • get_windows_number(name): 获取应用窗口数量
  • get_windows_id(name): 获取窗口 ID 列表
  • focus_windows(app_name): 聚焦指定窗口
  • get_lastest_window_id(app_name): 获取最新窗口 ID

🖥️ 平台实现细节

Linux 平台

我们的 Linux 实现就像一个多面手,能够适应不同的环境:

X11 实现

  • 工具链: xdotool + xwininfo
  • 特点: 稳定可靠,经过长期验证
  • 适用场景: 传统桌面环境(GNOME、KDE)

Wayland 实现

  • 工具链: dtkwmjack
  • 特点: 现代化设计,支持最新桌面
  • 适用场景: Deepin 等使用 Wayland 的发行版

Windows 平台

Windows 实现就像一个熟练的 Windows 专家:

  • 工具链: Windows API (user32.dll)
  • 特点: 原生性能,集成度高
  • 依赖: psutil 库(用于进程管理)
  • 额外功能: 支持快捷键操作(ESC 等)

🏛️ 架构设计

我们的架构就像一个精心设计的迷宫,简单却充满智慧:

relative_position/
├── elements.py              # Ele 和 Elements 类(元素定义核心)
├── config.py               # 平台检测和配置(自动识别)
├── exceptions.py            # 自定义异常(友好的错误提示)
├── utils.py                # 工具函数(日志、命令、快捷键)
├── __init__.py             # 模块入口(统一的 API)
├── linux/                  # Linux 平台实现
│   ├── base.py            # 抽象基类(接口定义)
│   ├── main.py            # ButtonCenter 实现
│   ├── x11_wininfo.py    # X11 窗口信息提供者
│   └── wayland_wininfo.py # Wayland 窗口信息提供者
└── windows/                # Windows 平台实现
    ├── main.py            # ButtonCenter 实现
    └── windows_wininfo.py # Windows 窗口信息提供者

设计优势 🎯

  • 解耦: X11 和 Wayland 实现完全独立,互不干扰
  • 可扩展: 想要支持新的显示服务器?实现一个类就行
  • 易维护: 统一的接口定义,代码结构像艺术品一样清晰
  • 平台优化: 每个平台都可以独立优化,不相互影响

📦 依赖管理

所有平台

  • Python 3.6+

Windows 平台

pip install psutil>=5.9.0

Linux 平台

# 基础依赖
pip install dbus-python>=1.3.2

# X11 依赖(如果使用 X11)
sudo apt-get install xdotool x11-utils  # Debian/Ubuntu
sudo yum install xdotool xorg-xwininfo  # RHEL/CentOS

# Wayland 依赖(如果使用 Wayland)
# 需要安装 dtkwmjack 库(Deepin 特定)

🎓 示例代码

更多示例请查看项目中的示例文件:

  • example_ele.py: Ele 类使用示例
  • example.py: 基础使用示例

🤝 贡献指南

欢迎贡献!不管是修复 bug 还是添加新功能,我们都感激不尽:

  1. Fork 本项目
  2. 创建你的特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交你的更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 提交一个 Pull Request

📄 许可证

本项目采用 Apache 2.0 许可证 - 详见 LICENSE 文件

🙏 致谢

感谢所有为这个项目做出贡献的开发者!


提示: 如果你在使用过程中遇到问题,不要犹豫,提交一个 issue。我们通常会在 24 小时内响应(除非我们在睡觉 😴)

让窗口定位变得简单有趣,从 relative-position 开始! 🚀

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

relative_position-1.0.0.tar.gz (30.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

relative_position-1.0.0-py3-none-any.whl (32.9 kB view details)

Uploaded Python 3

File details

Details for the file relative_position-1.0.0.tar.gz.

File metadata

  • Download URL: relative_position-1.0.0.tar.gz
  • Upload date:
  • Size: 30.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.8.10

File hashes

Hashes for relative_position-1.0.0.tar.gz
Algorithm Hash digest
SHA256 8eed1bc1ba8e7253c643fb8bad2ff62fc94dfedcf1df0f8c8c7cf3184052d199
MD5 9eee2650fc4f5b2192c48fc1cbcea38e
BLAKE2b-256 118e8cd009b50e5b6e04b764658e697e5a6f29af44bd16394c18e3ae0f5df1e7

See more details on using hashes here.

File details

Details for the file relative_position-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for relative_position-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2c9bb2396091a112817ba639b5ec199a18bb35a647af286082e9b7ca088fa024
MD5 4f009e05a2c0e0c99bb8f189d3d35611
BLAKE2b-256 1eced1c5877398c12168c0ff3ae86c90a744bed92c49411d591e0fdfe7bdcab5

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page