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

