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
相关产品推荐
相关产品推荐

