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

Python:如何在无限循环中触发保存光标坐标并终止循环?

光标坐标捕获与循环控制实现方案

你当前代码的核心问题是:pag.doubleClick()是主动执行双击动作,而非检测用户的双击操作,因此无法触发坐标保存逻辑;同时无限循环没有终止机制,只能强制结束进程。

以下是两种可行的实现方案,分别基于pynput(推荐,事件监听更可靠)和纯pyautogui:

方案一:使用pynput监听事件(推荐)

pynput专门用于监听输入设备事件,能更精准捕获双击、按键动作,同时支持优雅终止程序。

步骤1:安装依赖

pip install pynput

完整代码

import pyautogui as pag
from pynput import mouse, keyboard
import time

# 存储保存的坐标
saved_coords = []
# 控制主循环运行的标志
running = True

def on_double_click(x, y, button, pressed):
    """监听鼠标左键双击事件"""
    if pressed and button == mouse.Button.left:
        # 直接用事件返回的坐标,或调用pag.position()获取当前坐标
        coord = (x, y)
        saved_coords.append(coord)
        print(f"\n已保存坐标: {coord}")

def on_press(key):
    """监听按键事件"""
    global running
    try:
        # 按S键手动保存当前光标坐标
        if key == keyboard.KeyCode(char='s'):
            coord = pag.position()
            saved_coords.append(coord)
            print(f"\n已保存坐标: {coord}")
        # 按Esc键终止程序并输出保存的坐标
        elif key == keyboard.Key.esc:
            running = False
            print(f"\n程序已终止,保存的坐标列表: {saved_coords}")
            return False  # 停止键盘监听器
    except AttributeError:
        # 处理特殊按键(如功能键)的异常
        pass

# 启动鼠标和键盘监听器(后台运行)
mouse_listener = mouse.Listener(on_click=on_double_click)
keyboard_listener = keyboard.Listener(on_press=on_press)
mouse_listener.start()
keyboard_listener.start()

# 实时刷新显示当前光标坐标
while running:
    print(f"当前光标坐标: {pag.position()}", end='\r')
    time.sleep(0.1)

# 等待监听器结束
mouse_listener.join()
keyboard_listener.join()

核心逻辑说明

  • 鼠标监听器捕获左键双击,自动保存坐标
  • 键盘监听器支持:按S手动保存当前坐标,按Esc终止程序
  • 主循环通过running标志控制,退出时自动输出所有保存的坐标
  • 用end='\r'实现坐标实时刷新,避免控制台刷屏

方案二:纯pyautogui实现(无需额外依赖)

如果不想安装第三方库,可以通过循环检测鼠标点击间隔和按键状态实现,但可靠性略低于pynput。

完整代码

import pyautogui as pag
import time

saved_coords = []
running = True
click_count = 0
last_click_time = 0
# 双击时间阈值(单位:秒)
double_click_threshold = 0.3

while running:
    current_pos = pag.position()
    print(f"当前光标坐标: {current_pos}", end='\r')
    
    # 检测Esc键,触发程序终止
    if pag.keyDown('esc'):
        running = False
        print(f"\n程序已终止,保存的坐标列表: {saved_coords}")
        break
    
    # 检测鼠标左键点击,判断是否为双击
    if pag.mouseDown(button='left'):
        current_time = time.time()
        if current_time - last_click_time < double_click_threshold:
            saved_coords.append(current_pos)
            print(f"\n已保存坐标: {current_pos}")
            click_count = 0
        else:
            click_count += 1
        last_click_time = current_time
    
    # 检测S键,手动保存当前坐标
    if pag.keyDown('s'):
        saved_coords.append(current_pos)
        print(f"\n已保存坐标: {current_pos}")
    
    time.sleep(0.05)

核心逻辑说明

  • 通过记录两次点击的时间间隔,判断是否为双击
  • 循环检测Esc键终止程序,S键手动保存坐标
  • 调整double_click_threshold可修改双击的灵敏度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:43:22