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

PyAutoGUI locateAllOnScreen无法捕获ImageNotFoundException问题求助

解决locateAllOnScreen的ImageNotFoundException捕获问题

问题根源

locateAllOnScreen 返回的是生成器对象,调用它的时候并不会立刻执行屏幕查找逻辑。只有当你尝试迭代这个生成器(比如用list()转换为列表、或者循环遍历)时,才会实际执行查找并抛出ImageNotFoundException。而你之前的捕获逻辑只包裹了生成器的创建语句,根本触不到真正抛异常的环节,所以无效。

反观locateCenterOnScreen是立即执行查找,调用时就会抛出异常,所以之前的捕获逻辑能生效。

正确的异常捕获写法

方式1:转换列表时捕获异常

import pyautogui

try:
    # 创建生成器(此时还没查屏幕)
    match_generator = pyautogui.locateAllOnScreen("target.png", confidence=0.8)
    # 转换为列表时才会执行查找,这里捕获异常
    all_matches = list(match_generator)
except pyautogui.ImageNotFoundException:
    all_matches = []
    print("没找到任何匹配项")

# 后续处理所有匹配结果
for match in all_matches:
    center_pos = pyautogui.center(match)
    pyautogui.click(center_pos)

方式2:循环遍历中捕获异常

import pyautogui

has_match = False
try:
    # 遍历生成器时执行查找,异常在这里触发
    for match in pyautogui.locateAllOnScreen("target.png", confidence=0.8):
        has_match = True
        center_pos = pyautogui.center(match)
        pyautogui.click(center_pos)
except pyautogui.ImageNotFoundException:
    print("没找到任何匹配项")

if not has_match:
    print("遍历完成,无匹配内容")

为什么你的原有写法无效?

举个错误写法的例子,你大概率是这么写的:

# 错误示例:只捕获了生成器创建的环节,没覆盖实际查找的步骤
try:
    matches = pyautogui.locateAllOnScreen("target.png")
except pyautogui.ImageNotFoundException:
    print("没找到")
# 真正执行查找的是这一步,不在try范围内,所以还是会抛异常
match_list = list(matches)

无异常捕获的替代方案

如果不想处理异常,可以先检查是否存在匹配项,再遍历:

import pyautogui

# 先执行一次查找,确认有匹配再遍历
if pyautogui.locateOnScreen("target.png", confidence=0.8) is not None:
    for match in pyautogui.locateAllOnScreen("target.png", confidence=0.8):
        center_pos = pyautogui.center(match)
        pyautogui.click(center_pos)
else:
    print("没找到任何匹配项")

注意:这种方式会执行两次屏幕查找,性能略差,适合对性能要求不高的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:40:00