7

我正在尝试使用locateCenterOnScreen()PyAutoGUI 的功能,但是它引发了:

Traceback (most recent call last):
  File "C:\Users\windows\Desktop\asd.py", line 3, in <module>
    buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg')
TypeError: 'NoneType' object is not iterable

我的代码是:

import pyautogui

buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg')
pyautogui.doubleClick(buttonx,buttony)

我该如何解决这个问题?

4

3 回答 3

10

从 Pyautogui here的文档中,当它在屏幕上找不到图像时,方法 locateCenterOnScreen 返回 None 。

请注意,您正在从该方法中寻找 2 个结果,但 None 只是一个结果(因为该方法通常返回两个,这对我来说似乎是糟糕的设计——它应该引发异常,或者至少返回一个包含两个的元组无对象)。

看下面的例子,这基本上就是发生在你身上的事情:

>>> foo,bar = None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

在我看来,解决这个问题的最简单和最 Pythonic 的方法就是尝试抓住它:

try:
    buttonx,buttony = pyautogui.locateCenterOnScreen('who.jpg')
except TypeError:
    """ Do something to handle the fact that the image was not found"""

编辑:要回答您在评论中提出的问题,似乎对该库的工作方式或在屏幕上找到的内容存在误解。您通过一些图像为库提供了它需要查找的内容的表示。当该图像是无损的时,它的效果要好得多,因为它是一个精确的逐像素表示。然后,图书馆会在您的计算机屏幕上搜索所提供的图像所代表的实际事物。正如您提出的那样,它不会找到 jpeg 或 png。它找到实际渲染的对象。因此,如果您在桌面上截取 Web 浏览器图标的屏幕截图,它会从该屏幕截图中找到实际图标并单击它,但前提是它可见。如果它在其他窗户或其他东西的后面,它不会找到它。它不会在屏幕上搜索图标文件,但图标本身的渲染。因此,例如,如果您将实际的 .ico 文件提供给库,如果该图标被另一个窗口覆盖,它将无法找到该图标,即使该图标是技术上在您的桌面上,因为它当前未呈现。

于 2016-05-04T23:42:37.523 回答
0

为了简化事情——locateCenterOnScreen()方法应该返回图像的中心 (x,y) 坐标,因为你称之为“who.jpg”,只有当它存在于屏幕上时。否则,如果在屏幕上找不到“who.jpg”图像 - 方法应该返回“无”。

您不能将“NONE”值分配给 (x,y) 坐标,因为您得到一个值 ('NONE') 和两个等待接收某个值的变量。这就是为什么您会收到“TypeError”的原因。

尝试使用异常,这是在程序执行期间可能发生的事件 -> 例如 TypeError。尝试预测甚至在执行期间可能发生的其他事件,你会很好地完成你的任务!

为了您的方便,请尝试以下代码:

try:
    buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg')
    pyautogui.click(buttonx, buttony)
except TypeError:
    print("A TypeError has been occured!")
于 2017-09-02T08:08:04.130 回答
-3

如果您的图像大小为 1920x1080,则图像调用大约需要 1 或 2 秒。

因此,请尝试以下代码。

导入pyautogui 导入时间

时间.sleep(2)

buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg') pyautogui.doubleClick(buttonx,buttony)

你将能够解决你的困难。

于 2018-09-12T12:46:56.987 回答