You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现360度鼠标方向监听并输出至终端?

实现360度鼠标方向监听器的可行方案

常用库推荐

  • pynput:你已经在使用的库,原生支持鼠标移动事件监听,是实现实时方向计算最直接的选择。
  • pyautogui:更擅长静态坐标获取,结合定时采样也能实现方向计算,但实时性不如pynput。
  • mouse:轻量级第三方库,API极简,适合快速搭建监听逻辑。

核心逻辑:通过坐标差计算360度方向

要获取全角度方向,核心是记录鼠标上一次的坐标,每次移动时计算当前与上一次的坐标差(dx, dy),再用反正切函数转换为0-360°的角度值。

基于pynput的完整实现(推荐)

直接监听鼠标移动事件,实时计算并输出方向,解决你之前的360度监听问题:

from pynput.mouse import Listener
import math

# 初始化上一次鼠标坐标
last_x, last_y = None, None

def get_360_direction(dx, dy):
    # 计算弧度并转为角度(范围-180°到180°)
    angle_rad = math.atan2(dy, dx)
    angle_deg = math.degrees(angle_rad)
    # 转成0-360°的正角度范围
    if angle_deg < 0:
        angle_deg += 360
    return round(angle_deg, 2)

def on_mouse_move(x, y):
    global last_x, last_y
    if last_x is not None and last_y is not None:
        dx = x - last_x
        dy = y - last_y
        # 过滤微小抖动,避免无效数据
        if abs(dx) > 1 or abs(dy) > 1:
            direction = get_360_direction(dx, dy)
            print(f"当前鼠标方向:{direction}°")
    # 更新上一次坐标
    last_x, last_y = x, y

# 启动监听线程
with Listener(on_move=on_mouse_move) as listener:
    listener.join()

关键细节说明

  • 角度转换:math.atan2(dy, dx)返回的是相对x轴正方向的弧度,转角度后通过加360把负角度映射到0-360°区间,符合全方向需求。
  • 噪声过滤:设置dx/dy的阈值(比如绝对值大于1),可以过滤鼠标微小抖动产生的无效数据,让后续绘图数据更干净。
  • 实时输出:每次有效移动都会打印角度值,直接输出到终端,后续可以把数据存入列表或文件,为绘图做准备。

备选方案:pyautogui定时采样

如果坚持用pyautogui,通过定时获取坐标也能实现方向计算:

import pyautogui
import math
import time

last_x, last_y = pyautogui.position()

while True:
    current_x, current_y = pyautogui.position()
    dx = current_x - last_x
    dy = current_y - last_y
    if abs(dx) > 1 or abs(dy) > 1:
        angle_rad = math.atan2(dy, dx)
        angle_deg = math.degrees(angle_rad)
        angle_deg = angle_deg if angle_deg >= 0 else angle_deg + 360
        print(f"当前鼠标方向:{round(angle_deg, 2)}°")
    last_x, last_y = current_x, current_y
    time.sleep(0.01)  # 控制采样频率,平衡性能和实时性

绘图准备(长期目标)

可以把方向数据存入列表,比如在on_mouse_move里添加directions.append(direction),之后用matplotlib绘制变化曲线:

import matplotlib.pyplot as plt

# 假设directions是存储所有方向角度的列表
plt.plot(directions)
plt.xlabel("移动次数")
plt.ylabel("方向角度(°)")
plt.title("鼠标方向变化曲线")
plt.show()

内容的提问来源于stack exchange,提问作者reallybranden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:17:18