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

Python用tkinter开发自动移动鼠标脚本窗口未响应及功能失效问题求解

解决方案

问题原因

  • tkinter运行依赖主线程处理窗口刷新、按钮点击等所有交互操作,你写的while死循环和time.sleep()会持续占住主线程,导致窗口无法响应任何操作,就会出现「未响应」提示,OFF按钮点击也不会生效
  • 原代码遗漏了pyautogui库的导入,直接运行会报错

修复后完整代码

import tkinter as Tk
import pyautogui  # 补上遗漏的导入

root = Tk.Tk()
root.title("MouMo")
root.geometry("300x100")
root.configure(bg='white')

job_id = None  # 用来存定时任务的编号,方便后续取消

def move_mouse_loop():
    global job_id
    # 执行鼠标移动
    pyautogui.moveRel(0, 30, duration=1)
    pyautogui.moveRel(0, -30, duration=1)
    # 17秒后再执行一次自己,17秒=17*1000毫秒,要改170秒就改成170000
    job_id = root.after(17000, move_mouse_loop)

def turnon():
    global job_id
    onbtn['state'] = Tk.DISABLED
    # 启动循环
    move_mouse_loop()
            
def turnoff():
    global job_id
    onbtn['state'] = Tk.NORMAL
    # 取消还没执行的定时任务,停止循环
    if job_id is not None:
        root.after_cancel(job_id)
        job_id = None

onbtn = Tk.Button(root, text="ON", padx=50, command = turnon)
offbtn = Tk.Button(root, text="OFF", padx=50, command = turnoff)

onbtn.pack(side="left")
offbtn.pack(side="right")

root.mainloop()

改动说明

  • 去掉了会阻塞主线程的while循环和time.sleep(),改用tkinter自带的after()方法实现定时调度,等待的时间段内窗口可以正常响应操作,不会出现未响应
  • 新增job_id变量记录定时任务编号,点击OFF按钮时调用after_cancel()取消任务,就能停止鼠标移动循环,不需要关闭窗口
  • 补上了pyautogui的导入,避免运行报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:27:00