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

Pyautogui运行时触发cannot unpack non-iterable NoneType报错

根本原因

你之前两次调整都没有命中问题核心,报错的本质原因有两点:

  1. 传参逻辑完全错误:你虽然写了if xxx is not None的非空判断,甚至提前缓存了识别结果,但实际调用pyautogui.moveTo()时传入的是图片文件名,而非你提前缓存的坐标对象。这会导致moveTo内部重新执行一次全屏图像识别,你之前做的所有非空校验全部失效——只要这次二次识别因为界面瞬时遮挡、系统资源抢占、卡顿返回None,内部解包坐标时就会直接抛出你看到的TypeError。
  2. 缺少偶发失败兜底:pyautogui的图像识别本身不是100%稳定,系统长时间运行后内存占用升高、屏幕缩放进程刷新、弹窗临时遮挡都可能导致单次识别失败,你没有重试和异常兜底逻辑,一次识别失败就会导致整个程序崩溃。

你提到的“改完代码能正常跑1天再复现”也完全符合这个逻辑:刚启动程序时系统资源充足,moveTo内部二次识别成功率极高,运行时间久了后台进程变多、资源紧张,二次识别偶发返回None就会触发报错。

稳定修复方案
  • 彻底废弃「传图片路径给moveTo/click等交互函数」的写法,所有识别到的坐标结果校验通过后,直接取坐标值传给交互函数,从根源上避免二次识别。拿到locateOnScreen返回的坐标对象后,用pyautogui.center(坐标对象)即可获取目标中心点的(x,y)元组,直接传给moveTo即可。
  • 封装带重试的通用找图函数,单次识别失败后等待短时间重试3-5次,兜住界面瞬时刷新、系统卡顿导致的偶发识别失败。
  • 保留嵌套判断逻辑,上一步交互操作完成后等待界面稳定,再执行下一轮找图操作,避免界面还在加载时识别失败。
修复后参考代码
import pyautogui
import time
import keyboard
import random  
import win32api, win32con

def find_image_persist(img_path, confidence=0.8, max_retry=3, retry_interval=0.2):
    """带重试的稳定找图函数,识别成功返回坐标对象,多次失败返回None"""
    for _ in range(max_retry):
        pos = pyautogui.locateOnScreen(img_path, confidence=confidence)
        if pos is not None:
            return pos
        time.sleep(retry_interval)
    return None

def FindContact1():
    pyautogui.click(319,25)
    pyautogui.click(99,161)
    time.sleep(1)

    # 识别第一个目标,校验通过后直接使用缓存坐标,不再二次识别
    scheduled_pos = find_image_persist('ScheduledBy.png')
    if scheduled_pos is not None:
        print('Found Scheduled')
        pyautogui.moveTo(pyautogui.center(scheduled_pos))
        pyautogui.moveRel(245,20)
        time.sleep(.1)
        pyautogui.click()
        time.sleep(2)

        # 上一步操作完成、界面稳定后再识别下一个目标
        email_pos = find_image_persist('Email.png')
        if email_pos is not None:
            print("Found Email")
            pyautogui.moveTo(pyautogui.center(email_pos))
            pyautogui.moveRel(0,20)
            time.sleep(.2)
            pyautogui.tripleClick()
            time.sleep(.1)
            pyautogui.hotkey('ctrl', 'c')
            time.sleep(.1)
            pyautogui.click(88,25)
            time.sleep(2)

            cced_pos = find_image_persist('Cced.png')
            if cced_pos is not None:
                print("Found CCed")
                pyautogui.moveTo(pyautogui.center(cced_pos))
                pyautogui.moveRel(-44,0)
                time.sleep(.1)
                pyautogui.click()
                pyautogui.hotkey('ctrl', 'v')
额外注意事项

如果你的Windows系统开启了125%/150%等非100%屏幕缩放,建议先将缩放调整为100%,避免长时间运行后桌面窗口管理器进程刷新导致识别分辨率错位,进一步降低偶发失败概率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:39:19