You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动