如何在 Python 终端中利用 ANSI 转义序列获取鼠标悬停位置

聖光之護

聖光之護

2026-06-28

485人浏览

原创

通过启用终端的 X11/UTF-8 鼠标协议(如 \x1b[?1006h),配合实时读取 sys.stdin 的 CSI 序列,Python 程序可捕获鼠标移动事件并解析坐标;Textual 等库在此基础上结合渲染布局树实现精准悬停检测。

通过启用终端的 x11/utf-8 鼠标协议(如 `\x1b[?1006h`),配合实时读取 `sys.stdin` 的 csi 序列,python 程序可捕获鼠标移动事件并解析坐标;textual 等库在此基础上结合渲染布局树实现精准悬停检测。

在现代终端(如 kitty、alacritty、gnome-terminal ≥3.38、Windows Terminal)中,可通过 ANSI 转义序列启用鼠标事件报告模式,使终端将鼠标移动、按下、释放等动作以特殊 CSI(Control Sequence Introducer)序列形式写入标准输入(stdin)。这并非“黑箱 hack”,而是遵循 DEC Private Mode (DECSET)Xterm Mouse Protocol 标准的规范行为。

Python 3.14.2
Python 3.14.2

Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。

下载

✅ 正确启用鼠标跟踪的 ANSI 序列

你尝试的 \x1b[?1h\x1b[?9h... 混合了多种不兼容或已废弃的模式(如 ?1h 是启用 cursor keys mode,?9h 是启用 X10 鼠标协议——早已被弃用)。推荐使用 UTF-8 编码的 SGR 模式(?1006h),它支持精确坐标、按钮状态和 Unicode 安全:

import sys
import tty
import termios
import select

# 启用 UTF-8 鼠标协议(推荐)
sys.stdout.write("\x1b[?1006h")
sys.stdout.flush()

# 设置 stdin 为非阻塞、无缓冲、原始模式
old_settings = termios.tcgetattr(sys.stdin)
try:
    tty.setraw(sys.stdin.fileno())

    print("✅ 鼠标跟踪已启用。移动鼠标,按 Ctrl+C 退出。")
    while True:
        # 检查是否有输入(避免阻塞)
        if select.select([sys.stdin], [], [], 0.1)[0]:
            data = sys.stdin.read(1)
            if data == "\x1b":  # ESC 后可能跟 CSI 序列
                # 尝试读取后续字符(典型鼠标序列:ESC [ M Cb Cx Cy)
                # 注意:UTF-8 模式下为 ESC [ = 3:
                        try:
                            button_code = int(parts[0])
                            x = int(parts[1]) - 1  # 终端坐标从 1 开始
                            y = int(parts[2]) - 1
                            print(f"?️ 鼠标位置:({x}, {y}),按钮码:{button_code}")
                        except ValueError:
                            pass
finally:
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
    # ⚠️ 必须关闭协议,否则终端可能残留异常行为
    sys.stdout.write("\x1b[?1006l")
    sys.stdout.flush()

? 关键说明与注意事项

  • 协议选择优先级:?1006h(UTF-8 SGR) > ?1015h(urxvt 扩展) > ?1005h(UTF-8 基础) > ?1000h(X10,仅支持左键+坐标,不推荐)。
  • 坐标系:终端以左上角为 (1,1),x 为列号,y 为行号;实际应用中需减 1 转换为 0-based 索引。
  • 布局映射是核心:单纯获取坐标并无意义——Textual 的真正能力在于其内部维护的渲染布局树(render tree)。它记录每个 Widget 在虚拟屏幕上的精确矩形区域(Region),收到 (x, y) 后通过 O(1) 区域命中检测(如 region.contains(x, y))快速定位目标控件。
  • 安全退出:务必用 \x1b[?1006l 关闭协议,否则可能导致终端鼠标行为异常(如光标消失、粘滞)。
  • 平台限制:Windows CMD 不支持;PowerShell 7+ / Windows Terminal 支持良好;macOS Terminal.app 默认不支持,推荐使用 iTerm2 或 Kitty。

✅ 总结

获取鼠标悬停位置 ≠ 直接“读取像素坐标”,而是一套协同机制:
① 终端层:通过标准 ANSI 协议上报事件;
② 输入层:程序以 raw 模式解析 CSI 序列;
③ 应用层:结合自身 UI 布局信息完成语义化映射。
Textual 并未使用“hack”,而是严谨实现了终端协议 + 布局引擎的完整链路——这也是构建响应式终端 GUI 的专业路径。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1105

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2072

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1185

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8821

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1479

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1552

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

881

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

531

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习