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

Python双击程序异常:左键点击卡顿且仅触发一次点击求助

问题分析与解决方案

问题根源

  1. 递归事件循环:原代码中pynput的鼠标监听器捕获手动左键点击后,调用pyautogui.click()模拟点击,这个模拟操作又会被监听器再次捕获,触发重复执行,形成递归事件循环,占用系统资源导致光标卡顿。
  2. 错误的按钮判断:原代码里button == button.left是错误写法,button是函数参数(当前点击的按钮实例),正确判断需与Button.left枚举值对比,要先导入Button类。
  3. 坐标未指定:pyautogui.click()默认点击当前光标位置,手动点击时光标在固定坐标,不指定坐标的模拟点击会导致光标偏移,加重卡顿。

修正后的代码(方案一:标志位区分手动/模拟点击)

from pynput.mouse import Listener, Button
import pyautogui

# 标记是否为程序模拟的点击,避免循环触发
is_simulated = False

def on_click(x, y, button, pressed):
    global is_simulated
    # 仅处理手动触发的左键按下事件
    if button == Button.left and pressed and not is_simulated:
        print("wawawa")
        # 设置标记,下一次点击为模拟事件,跳过处理
        is_simulated = True
        # 在点击位置模拟左键点击,避免光标移动
        pyautogui.click(x, y)
    # 模拟点击触发的事件,重置标记
    elif button == Button.left and pressed and is_simulated:
        is_simulated = False

with Listener(on_click=on_click) as listener:
    listener.join()

修正后的代码(方案二:模拟点击时暂停监听器)

from pynput.mouse import Listener, Button
import pyautogui

def on_click(x, y, button, pressed):
    if button == Button.left and pressed:
        print("wawawa")
        # 暂停监听器,避免捕获模拟点击事件
        listener.stop()
        # 在当前点击位置模拟点击
        pyautogui.click(x, y)
        # 重启监听器,继续监听手动点击
        listener.start()

with Listener(on_click=on_click) as listener:
    listener.join()

效果说明

  • 两种方案都能阻断递归事件循环,消除光标卡顿问题。
  • 每次手动左键点击时,程序会在同一位置自动触发一次额外的左键点击,实现预期的双击效果。
  • 控制台仅在每次手动点击时打印一条wawawa,不会重复输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:58:24