
pyautogui自0.9.41版本起,`locateonscreen()`在找不到图像时抛出`imagenotfoundexception`而非返回`none`,因此直接用`if/else`判断会报错;推荐使用`try/except`捕获异常,或改用`locateallonscreen()`配合`next()`安全获取结果。
在使用 PyAutoGUI 进行屏幕图像识别时,一个常见误区是假设 pyautogui.locateOnScreen() 在匹配失败时会返回 None,从而可以直接用于布尔判断(如 if locateOnScreen(...) != None:)。但实际上,自 PyAutoGUI v0.9.41 起,该函数在未找到目标图像时会明确抛出 pyautogui.ImageNotFoundException 异常,而非返回 None。这导致原始代码中的 else 分支永远无法执行,程序直接中断并报错。
✅ 正确且推荐的做法是使用 try/except 捕获异常——这不仅符合 Python 的“请求宽恕而非许可”(EAFP)惯用法,也是官方文档明确支持的标准实践:
import pyautogui
import time
while True:
try:
pyautogui.locateOnScreen("1.png", confidence=0.9)
print("I can see it")
except pyautogui.ImageNotFoundException:
print("I cannot see it")
time.sleep(0.5)⚠️ 注意:需确保已正确导入 time 模块(原示例中遗漏了 import time),否则会触发 NameError。
? 替代方案:若坚持避免 try/except,可利用 locateAllOnScreen() ——它返回一个生成器,在未匹配时为空,配合 next(..., default) 即可安全判空:
import pyautogui
import time
while True:
# locateAllOnScreen 返回匹配位置的迭代器;next(..., None) 在无结果时返回 None
match = next(pyautogui.locateAllOnScreen("1.png", confidence=0.9), None)
if match is not None:
print("I can see it")
else:
print("I cannot see it")
time.sleep(0.5)? 补充说明:
- locateAllOnScreen() 效率略低于 locateOnScreen()(因内部仍尝试全屏扫描),但对单图检测场景影响微乎其微;
- confidence 参数建议保持在 0.7–0.95 区间,过低易误匹配,过高则敏感度不足;
- 图像文件路径应为绝对路径或确保工作目录正确,否则会额外抛出 FileNotFoundError;
- 首次调用前建议添加 pyautogui.FAILSAFE = True(默认开启),防止脚本失控——移动鼠标到屏幕左上角可强制中断。
综上,异常处理不是“绕弯”,而是 PyAutoGUI 设计的明确契约。拥抱 try/except 是最清晰、健壮且符合生态规范的选择;而 locateAllOnScreen() + next() 则是语义等价的函数式备选,适用于特定编码风格偏好场景。










