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

如何在PyAutoGUI中实现转向时鼠标平滑移动及路径设置?

PyAutoGUI实现鼠标平滑移动与路径设置

一、替代瞬移:实现鼠标平滑移动

1. 用PyAutoGUI原生参数快速实现

PyAutoGUI的moveTo()和moveRel()方法自带duration参数,只需设置移动耗时(单位:秒),就能直接让鼠标在两点间平滑移动,无需额外处理。

示例代码:

import pyautogui

# 从当前位置平滑移动到(500, 500),耗时2秒
pyautogui.moveTo(500, 500, duration=2)

# 相对当前位置向右下移动100像素,耗时1.5秒
pyautogui.moveRel(100, 100, duration=1.5)

2. 自定义缓动效果的细腻平滑

如果需要更自然的缓动(比如先加速后减速的ease-in-out效果),可以自己实现插值逻辑,分步移动鼠标:

import pyautogui
import time

def smooth_move_to(target_x, target_y, duration=2):
    start_x, start_y = pyautogui.position()
    total_steps = int(duration * 60)  # 按60帧/秒拆分移动步骤
    for step in range(total_steps + 1):
        # 二次缓动公式,实现先慢后快再慢的效果
        t = step / total_steps
        t = t * 2 if t < 0.5 else 1 - (1 - t) * 2
        current_x = start_x + (target_x - start_x) * t
        current_y = start_y + (target_y - start_y) * t
        pyautogui.moveTo(current_x, current_y)
        time.sleep(1/60)

# 调用:平滑移动到(800, 600),耗时3秒
smooth_move_to(800, 600, duration=3)

二、设置移动路径:避免手动插值

如果需要沿曲线、多边形等复杂路径移动,无需手动计算每个插值点,可借助数学库生成路径点后依次移动。

1. 贝塞尔曲线路径

通过控制点生成平滑的贝塞尔曲线,再沿路径点移动:

import pyautogui
import time
import numpy as np

def generate_bezier_path(control_points, num_points=100):
    n = len(control_points) - 1
    t = np.linspace(0, 1, num_points)
    curve = np.zeros((num_points, 2))
    for i in range(n+1):
        binom_coeff = np.math.comb(n, i)
        curve += binom_coeff * (1 - t)**(n - i) * t**i * np.array(control_points[i])
    return curve.astype(int)

# 定义贝塞尔曲线的控制点:起点、两个中间控制点、终点
control_points = [(100, 100), (300, 500), (600, 200), (800, 600)]
path = generate_bezier_path(control_points, num_points=150)

# 沿路径移动鼠标
for x, y in path:
    pyautogui.moveTo(x, y)
    time.sleep(1/60)

2. 三次样条曲线路径

利用scipy的三次样条插值,基于关键点生成平滑路径:

import pyautogui
import time
import numpy as np
from scipy.interpolate import CubicSpline

def generate_spline_path(key_points, num_points=100):
    x_coords = [p[0] for p in key_points]
    y_coords = [p[1] for p in key_points]
    t = np.linspace(0, len(key_points)-1, len(key_points))
    spline_x = CubicSpline(t, x_coords)
    spline_y = CubicSpline(t, y_coords)
    t_new = np.linspace(0, len(key_points)-1, num_points)
    x_new = spline_x(t_new).astype(int)
    y_new = spline_y(t_new).astype(int)
    return list(zip(x_new, y_new))

# 定义路径上的关键节点
key_points = [(200, 200), (400, 500), (700, 300), (900, 700)]
path = generate_spline_path(key_points, num_points=200)

# 沿路径移动鼠标
for x, y in path:
    pyautogui.moveTo(x, y)
    time.sleep(1/60)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:22:27