PyAutoGUI脚本运行一段时间后报cannot unpack non-iterable NoneType错误解决方案
PyAutoGUI脚本报错原因与修复方案
错误产生原因
- 核心问题是代码中连续两次调用了
pyautogui.locateOnScreen接口:第一次调用用来判断目标是否存在,第二次调用直接对返回结果做解包赋值。两次调用存在毫秒级的时间差,刚好在这个间隔内画面中的archer.png目标消失、或者识别置信度不达标,第二次调用就会返回None,对None执行四变量解包操作就会触发该TypeError。 - 额外注意:
locateOnScreen返回的四个值对应左边界坐标、上边界坐标、目标宽度、目标高度,原代码中的变量名width、high命名有误,后续点击实际用的是左上角坐标,命名不准确容易后续维护出错。
修复后的代码
from pyautogui import * import pyautogui import time import keyboard import random import win32api, win32con time.sleep(3) def click(x, y): win32api.SetCursorPos((x, y)) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0) while keyboard.is_pressed('q') == False: # 仅调用一次识别接口,把结果存到变量中 target_pos = pyautogui.locateOnScreen('archer.png', confidence=0.8, region=(260, 760, 1400, 200)) if target_pos is not None: left, top, width, height = target_pos # 点击目标左上角位置,如果你要点击中心可以改成 left + width//2, top + height//2 click(left, top) # 可选:增加小间隔降低CPU占用,根据需求调整 time.sleep(0.01)
优化说明
- 仅调用一次图像识别接口,既避免了两次调用结果不一致的问题,也减少了重复识别的性能开销
- 可调整点击坐标为目标中心,避免识别到的目标边缘点击无效的问题
- 增加循环间隔降低CPU占用,不会影响识别时效性
内容的提问来源于stack exchange,提问作者Barszcz Mielony OFFICIAL
相关产品推荐
相关产品推荐

