pyautogui.locateCenterOnScreen()返回的是None而不是坐标

21
import pyautogui
print (pyautogui.locateCenterOnScreen("C:\Users\Venkatesh_J\PycharmProjects\mouse_event\mouse_event.png"))

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


@GLHF 你说的“图片在我的桌面上”是什么意思?这段代码将查找实际图像是否可见于屏幕上。如果没有找到,它将返回None,如唐的回答所述,您将收到此错误消息。请注意,在代码运行时,图像必须对用户可见。它不会找到桌面上的图标或类似物,也不会找到隐藏在其他窗口后面的图像。这是你想做的吗? - J Richard Snape
我遇到了相同的错误。尝试使用打印屏幕图像和实际下载的图像。尝试了来自http://pyautogui.readthedocs.io/en/latest/screenshot.html的计算器示例。我只得到了响应:TypeError:'NoneType'对象不可迭代。正在Windows 10上工作。 - Mihai Marinescu
9个回答

11
当我使用pyautogui的内置函数来截屏时,我的问题得到了解决,而不是使用WIN+Printscr。因为如果我们使用WIN+Printscr进行截屏,则与pyautogui内置函数相比,像素密度和其他图像相关数据可能会有所不同。
也许这个方法对你有效,对我有效。
例如- wifi.png wifi.png 所以我首先进行全屏截图,然后从完整图像中裁剪出所需部分,并将其放入下面显示的代码中。
import pyautogui
print(pyautogui.locateCenterOnScreen('wifi.png'))

你是不是想说 PrtScn - Xantium
1
是的,打印屏幕按钮或任何您截取屏幕截图的方式。 - abhishek Singh
pyautogui.screenshot() - Mr-Programs
太棒了,谢谢! 这是如何保存屏幕截图的方法: im1 = pyautogui.screenshot() im1.save(r"c:\path\to\my\screenshot.png") - Pfinnn

7

似乎在屏幕上找不到与您的图像匹配的任何内容。

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


1
不想领走奖金,这个答案或多或少是正确的 - 我认为你应该加上一点,即这取决于图像是否在可见窗口环境中。因此,如果与指定目标图像匹配的图像“在屏幕上”,也就是说在窗口中,但该窗口被“隐藏”在另一个窗口“后面”,则将返回None。另外 - 奖励提供者说:“图片在我的桌面上”。我想知道这是否意味着文件图标在桌面上而不是实际图片被显示 - 可能有误解... - J Richard Snape

2
最初的问题非常简单 - 库无法在屏幕上找到传递的图像,并因此返回None而不是它所说的坐标(文档中)
然而,这里可能存在一些误解,特别是一个用户在问题上发布了赏金并提出了类似的问题。。有人发表了评论:

"图片在我的桌面上"

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

示例

假设你的桌面上有一个名为 flower.jpg 的文件,其中包含以下图片。

enter image description here

没有其他窗口打开时,请运行以下命令:
coords = pyautogui.locateCenterOnScreen('C:\\Richard\\Users\\flower.jpg')
print(coords)

结果是
这是因为我的屏幕上没有显示该图像,即使桌面上有一个名为flower.jpg的图标。即使该图标是花的缩略图,这也是正确的。
然而,如果我保持图像可见(当我准备这篇文章时),并做同样的事情,我会得到坐标 - 例如:

enter image description here

如你所见 - 因为实际图像在屏幕上,库会找到它,并给出坐标524,621
总之,如果库在用户屏幕上找不到图像,则会返回None。请注意,在代码运行的那一点上,图像必须对用户可见。它不会找到桌面上的图标或类似物,也不会找到在另一个“隐藏”窗口中的图像。这是你想做什么吗?

好的解释,有没有比 pyautogui 更好的库?我的意思是它需要在屏幕上找到完全相同的图片。有时候我们需要寻找相似的图片。 - GLHF
1
@GLHF 在 pyautogui 内部,使用了与作者相同的模块 pyscreeze - 代码在这里 - 用于 locate 函数。看看那里的代码,必须是精确匹配,而不是缩放版本或“类似”。我不知道是否有类似的库进行模糊或“类似”的匹配,但您可以分两步完成。一种选择是拍摄屏幕截图(例如使用 autopygui),然后使用 openCV 进行匹配- http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html - J Richard Snape

1

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

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

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

希望问题得到解决!


如果您更改了系统设置中的屏幕大小,则pyautogui.locateCenterOnScreen()也会受到影响。例如:如果您使用显示器拍摄了截图,然后在使用不同的显示器或笔记本电脑时进行比较。在大多数情况下,原始屏幕大小必须完全相同,包括浏览器等自动调整大小的情况。所以,是的,这在一开始也困扰了我几次。 - JayRizzo

0
尝试这个: pip install opencv-contrib-python
我曾经运行了相同的代码:
coords = pyautogui.locateCenterOnScreen('C:\\test.jpg')
在两个不同的虚拟环境(X和Y,几乎相同)中返回了None和Point(x=1543, y=461),这让我很困惑。
我阅读了Aleks的答案,并猜测它在当前环境中使用了参数confidence的隐式值(Y有但X没有)。
我没有深入挖掘,只是在虚拟环境X中安装了opencv-contrib-python并解决了我的问题。

0
继Don Kirby所说的,屏幕上没有找到匹配的图像。您可以在Windows照片库(或Tk)中打开图像,然后pyautogui就能找到它了。

0
如果由于图像问题而无法使用pyautogui.locateCenterOnScreen(),请尝试使用剪切工具(如果您使用的是Windows系统)来截取屏幕截图。这样可以解决问题。 另外,请确保您已经下载了"Pillow"模块。

0
很好的解释,有没有比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。


意外的关键字参数'confidence' - Mr-Programs
需要opencv_python。 - Mr-Programs

0

没有必要截屏,你可以默认调整置信度参数,它只会返回图像是否完全匹配。你可以做的是

pic_location = pyautogui.locateOnScreen("edge-pic.png",confidence=0.9)

但是为了做到这一点,您需要导入opencv-python包 使用命令。

pip install opencv-python

0.9表示匹配度为90% - Taha Irtaza
您的回答可以通过添加更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认您的回答是否正确。您可以在帮助中心找到关于如何撰写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接