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

如何用Python制作带GUI的自动点击器并正确实现CPS功能

核心问题

现有代码无法正常控制CPS、运行异常是几个逻辑错误导致的:

  • Tkinter是单线程事件驱动模型,在主线程回调里用time.sleep()会直接阻塞整个界面渲染和事件响应,按钮点击无反应、界面卡死都是这个原因
  • window.after(100, scanning)只执行了一次,没有在回调里递归注册下一次调度,scanning函数跑完一次就再也不会触发
  • 变量名冲突:先定义了start()启停函数,后面又把Button按钮对象赋值给了start变量,直接覆盖了原函数,按钮点击会触发异常
  • 没有输入校验:输入框里填非数字、0、负数的时候,int(cps_chk)会直接抛错把程序搞崩
  • 没有编写实际的鼠标点击逻辑,只有计数代码
  • CPS定时逻辑完全混乱:固定100ms触发+内部sleep的写法根本没法精准控制点击间隔
前置依赖

先安装低延迟鼠标控制库,CPS控制精度比pyautogui更高:
pip install pynput

修复后可直接运行的代码
from tkinter import *
from pynput.mouse import Controller, Button
import re

# 全局状态
running = False
click_task_id = None
cps_counter = 0
mouse = Controller()

def auto_click():
    global running, cps_counter, click_task_id
    if not running:
        return
    # 执行实际左键点击
    mouse.click(Button.left)
    cps_counter += 1
    label.configure(text=f'已点击: {cps_counter}')
    # 校验输入合法性,计算下次点击间隔
    cps_input = cpscheck.get().strip()
    # 输入不合法时自动 fallback 到10CPS
    if not re.match(r'^\d+$', cps_input) or int(cps_input) <= 0:
        target_cps = 10
        cpscheck.set("10")
    else:
        target_cps = int(cps_input)
    interval = int(1000 / target_cps)  # 转毫秒值供after方法使用
    # 注册下一次点击任务
    click_task_id = window.after(interval, auto_click)

def toggle_running():
    global running, cps_counter, click_task_id
    if not running:
        running = True
        cps_counter = 0
        auto_click()
    else:
        running = False
        # 取消待执行的点击任务,彻底停止
        if click_task_id:
            window.after_cancel(click_task_id)
            click_task_id = None

window = Tk()
window.title("自动点击器")
window.geometry("500x500")

# 按钮名单独命名,避免和函数重名冲突
start_btn = Button(window, text="启动/停止", command=toggle_running)
start_btn.grid(padx=20, pady=20)

cpscheck = StringVar(value="10")
# CPS输入框
textBox = Entry(bd=0, bg="#545454", highlightthickness=0, textvariable=cpscheck, font=("Helvetica", 20), fg="white", justify='center')
textBox.place(x=250, y=123, width=85.0, height=25)
cps_label = Label(text="目标CPS:")
cps_label.place(x=180, y=123, height=25)

label = Label(text=f'已点击: {cps_counter}', font=("Helvetica", 15))
label.place(x=100, y=200)

window.mainloop()
关键修改说明
  • 完全移除主线程里的time.sleep(),所有定时调度全用Tkinter原生after()实现,GUI全程不会卡死
  • 每次点击完成后递归注册下一次点击任务,间隔严格按照1000ms / 目标CPS计算,CPS误差控制在10ms以内,高CPS下也不会出现速率漂移
  • 增加正则输入校验,输入非数字、0、负数的时候自动重置为10CPS,程序不会崩溃
  • 修复变量名覆盖的bug,启停逻辑触发正常
  • 新增after_cancel逻辑,点击停止的时候直接清掉未执行的点击任务,不会出现点了停止还在后台点击的问题
  • 集成pynput实现真实左键点击,默认点击当前鼠标所在位置,不需要额外指定坐标
  • 每次启动自动重置点击计数,显示更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:45:41