【问题标题】:pyautogui.locateCenterOnScreen() returns None instead of coordinatespyautogui.locateCenterOnScreen() 返回 None 而不是坐标
【发布时间】:2015-11-16 07:48:25
【问题描述】:
import pyautogui
print (pyautogui.locateCenterOnScreen("C:\Users\Venkatesh_J\PycharmProjects\mouse_event\mouse_event.png"))

它不返回坐标,而是返回None

【问题讨论】:

  • @GLHF “图片在我的桌面上”是什么意思?如果它在屏幕上可见,此代码将查找实际图像。如果没有找到它,它将按照Don's answer 返回None,您将收到此错误消息。请注意,图像必须在代码运行时对用户可见。它不会在您的桌面上找到图标或类似图标,也不会在“隐藏”在另一个窗口中的窗口中找到图像。这就是你想要做的吗?
  • 我得到同样的错误。尝试使用打印屏幕图像和实际下载的图像。用计算器尝试了pyautogui.readthedocs.io/en/latest/screenshot.html 中的示例。我只得到响应:TypeError: 'NoneType' object is not iterable。在 Windows 10 上工作

标签: python python-3.4 pyautogui


【解决方案1】:

看起来像 couldn't find 任何与屏幕上的图像匹配的东西。

locateCenterOnScreen(image, grayscale=False) - 返回屏幕上第一个找到的图像实例中心的 (x, y) 坐标。如果在屏幕上没有找到,则返回 None。

【讨论】:

  • 不想去偷赏金,这个答案或多或少是正确的 - 我认为你应该添加,不过,图像是否 可见 很重要一个窗口化的环境。因此,如果与指定目标图像匹配的图像是“在屏幕上”,因为它在一个窗口中,但该窗口被另一个“后面”遮挡,则将返回None。另外 - 赏金奖说“图片在我的桌面上”。我想知道这是否意味着文件图标在桌面上而不是显示实际图像 - 可能是误解......
【解决方案2】:

你确定图片和图标大小一样吗?

如果不是pyautogui.locateCenterOnScreen() 将引发TypeError: 'NoneType' object is not iterable

还要确保完整的图标可见并且看起来与图像相同:"C:\Users\Venkatesh_J\PycharmProjects\mouse_event\mouse_event.png"

希望问题解决!

【讨论】:

  • 如果您在系统设置中更改屏幕尺寸,pyautogui.locateCenterOnScreen() 也会受到影响。示例:如果您使用显示器截取屏幕截图,那么,将其与您使用不同显示器或笔记本电脑时的屏幕进行比较。在大多数情况下,原始屏幕尺寸必须与浏览器等上的auto resizing 完全相同。所以,是的,这让我一开始也有好几次。
【解决方案3】:

根据 Don Kirby 所说,在屏幕上找不到匹配的图像。例如,您可以在 Windows 照片库(或Tk)中打开图像,然后pyautogui 会找到它。

【讨论】:

    【解决方案4】:

    最初的问题很简单 - 库没有找到传递的图像在屏幕上表示,因此返回 None 而不是它所说的坐标 in the docs

    但是,这里可能存在误解,尤其是来自一位在该问题上发布赏金并提出similar question here. 的用户。发表了评论

    “图片在我的桌面上”

    当你使用这个函数时,你传入一个文件名作为一个字符串。然后库加载图像文件并在屏幕上查找图片(而不是文件名)。 pyautogui.locatecentreonscreen() 将寻找实际图像(如果它在屏幕上可见)。它不会在桌面上查找文件,也不会查找与传递给它的图像同名的文件图标。

    示例

    假设您有一个名为 flower.jpg 的文件,其中包含以下图像,保存在您的桌面上。

    在没有打开其他窗口的情况下,运行:

    coords = pyautogui.locateCenterOnScreen('C:\\Richard\\Users\\flower.jpg')
    print(coords)
    

    结果是None

    这是因为我的屏幕上没有显示该图像即使桌面上有一个图标,名称为flower.jpg。即使该图标是花朵的小尺寸版本也是如此。

    但是,如果我让图像可见(在我准备这篇文章时)并做同样的事情,我会得到坐标 - 例如:

    如您所见 - 因为实际图像在屏幕上,所以库会找到它,并带有坐标 524,621

    总而言之,如果库在屏幕上找不到显示给用户的图像,它将返回 None。请注意,图像必须在代码运行时对用户可见。它不会在您的桌面上找到图标或类似图标,也不会在“隐藏”在另一个窗口后面的窗口中找到图像。这就是你想要做的吗?

    【讨论】:

    • 很好的解释,有没有比pyautogui更好的库?我的意思是它想要excatly 屏幕上的同一张图片。我们有时需要similar
    • @GLHF 在底层,pyautogui 使用同一作者的模块 pyscreeze - code here - 用于定位功能。查看那里的代码,它必须是完全匹配的,而不是缩放版本或“相似”。我不知道有类似的库进行模糊或“类似”匹配,但您可以分两步完成。一种选择是截取屏幕截图(例如使用autopygui),然后使用openCV 进行匹配 - docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/…
    【解决方案5】:

    当我通过 pyautogui 内置函数而不是 WIN+Printscr 截屏时,我的问题得到了解决,因为如果我们通过 WIN+ 截屏Printscr 那么像素密度和其他图像相关数据可能与 pyautogui 内置功能不同。
    也许这件事对你有用,对我有用。
    对于 Ex - wifi.png 所以首先我截取了完整的截图并从完整的图像中裁剪了它然后我把它放在下面显示的代码中

    import pyautogui
    print(pyautogui.locateCenterOnScreen('wifi.png'))
    

    【讨论】:

    • 你的意思是PrtScn
    • 是打印屏幕按钮或任何您拍摄屏幕截图的方式
    • pyautogui.screenshot()
    【解决方案6】:

    很好的解释,有没有比 pyautogui 更好的库?我的意思是它想要在屏幕上显示完全相同的图片。我们有时需要类似的。 – GLHF 2016 年 5 月 11 日 15:45

    尝试使用以下代码行:

    pyautogui.locateCenterOnScreen("yourscreenshot.PNG", confidence=0.9)
    

    我相信置信度范围为 0.1-0.9。 除非您有几张看起来几乎相似的图片,否则这可能会解决异常。 如果这不起作用,请尝试使用更多/更少的原始图像制作第二个屏幕截图并编写以下代码:

    try:
        pyautogui.locateCenterOnScreen("yourscreenshot.PNG", confidence=0.9)
    except TypeError:
        pyautogui.locateCenterOnScreen("yourscreenshot2.PNG", confidence=0.9)
    

    这将再次尝试使用稍微不同的图片,并希望不会返回 TypeError。

    【讨论】:

    • 意外的关键字参数“信心”
    • 需要opencv_python
    【解决方案7】:

    如果你因为图片问题不能使用pyautogui.locateCenterOnScreen(),尝试使用截图工具(如果你在Windows上)截图。它可以工作。 还要确保你已经下载了“枕头”模块

    【讨论】:

      【解决方案8】:

      试试这个:

      pip install opencv-contrib-python

      运行相同的代码让我很困惑:

      coords =pyautogui.locateCenterOnScreen('C:\\test.jpg')

      在两个不同的虚拟环境(X和Y,几乎一样)返回NonePoint(x=1543, y=461)

      我阅读了 Aleks 的答案,并猜测它在当前环境中 opencv-contrib-python 时隐式使用参数 confidence(Y 有但 X 没有)。

      我没有深入研究,只是在虚拟环境 X 中安装了opencv-contrib-python 并解决了我的问题。

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 1970-01-01
        • 2018-03-08
        • 2012-09-24
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        相关资源
        最近更新 更多