Python 3.6.3中pyautogui.locateOnScreen返回None问题求助
PyAutoGUI's locateOnScreen Returns None Even After Multiple Screenshots of Target Image
问题描述
我遇到了一个棘手的问题:我尝试用PyAutoGUI的locateOnScreen()函数定位一张名为"find.png"的图片(这张图是包含import pyautogui as auto语句的截图),但即使我截取了20张不同的屏幕截图来测试,函数始终返回None。
我是通过Python解释器运行代码的,代码如下:
import pyautogui as auto # 尝试定位目标图片 result = auto.locateOnScreen('find.png') print(result)
备注:
- "find.png"和代码文件在同一目录下,并且我已经通过PIL的Image模块确认这张图片可以被正常读取。
可能的解决方案及排查方向
我之前也踩过类似的坑,下面几个方向应该能帮你解决问题:
1. 调整匹配精度参数
PyAutoGUI默认的匹配精度要求很高,哪怕是屏幕上的字体抗锯齿、轻微颜色差异都可能导致匹配失败。你可以试试这两个参数:
- 如果安装了
opencv-python(先执行pip install opencv-python),可以降低confidence阈值,给匹配留些容错空间:result = auto.locateOnScreen('find.png', confidence=0.8) - 没有OpenCV的话,用
grayscale=True把图片转成灰度图匹配,能减少颜色差异的影响:result = auto.locateOnScreen('find.png', grayscale=True)
2. 排查屏幕缩放问题
如果你的系统开了高DPI缩放(比如Windows的125%/150%缩放、Mac的Retina屏幕),PyAutoGUI的坐标计算可能会和实际屏幕不匹配。试试这两个办法:
- 暂时关闭系统缩放,重新截取目标图片再测试;
- 先用
auto.screenshot()获取当前屏幕的截图,再用locateOnImage()在截图里匹配,确保缩放一致:screen_img = auto.screenshot() result = auto.locateOnImage('find.png', screen_img)
3. 精简目标图片范围
有时候我们截取的图片会包含多余的空白区域,这些无关区域会干扰匹配。你可以用图片编辑工具把"find.png"裁剪到只包含import pyautogui as auto这一行文字,尽量缩小目标范围,提高匹配成功率。
另外,也可以用locateAllOnScreen()函数查看是否有低匹配度的结果,帮你排查问题:
for position in auto.locateAllOnScreen('find.png', confidence=0.7): print(position)
4. 确认图片无损坏
虽然你用PIL能打开图片,但还是可以检查下"find.png"的格式是否标准——比如有没有被意外转成其他格式后改了后缀,或者截图时是否出现了像素丢失的情况。可以重新截取一次目标区域,保存为新的PNG文件再测试。
内容的提问来源于stack exchange,提问作者Susmit




