【问题标题】:Pyautogui TypeError: 'NoneType' object is not iterablePyautogui TypeError:“NoneType”对象不可迭代
【发布时间】:2016-08-30 14:33:48
【问题描述】:

我正在尝试使用 PyAutoGUI 的 locateCenterOnScreen() 函数,但是它会引发:

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)

我该如何解决这个问题?

【问题讨论】:

  • 确保“who.jpg”确实存在。
  • @IgnacioVazquez-Abrams 我做到了。它也存在我也放了那张照片的完整路径。还是一样的问题。
  • 耸耸肩 PyAutoGUI 不同意。
  • 您是否考虑过改用无损图像格式?
  • 不要将 JPEG 转换为 PNG,重新捕获图像。 JPEG 已经失真了。

标签: python python-3.4 pyautogui


【解决方案1】:

根据 Pyautogui here 的文档,locateCenterOnScreen 方法在无法在您的屏幕上找到图像时返回 None。

请注意,您正在寻找此方法的 2 个结果,但 None 只是一个结果(因为该方法通常返回两个,这对我来说似乎是糟糕的设计 - 它应该引发异常,或者至少返回一个具有两个 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"""

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

【讨论】:

  • 我必须找到该图片的位置,如果我发现错误,我将无法找到它。这对我来说不是一个解决方案,它基本上是一个错误捕获。
  • 这正是错误捕获。在您的屏幕上找不到图片,因此库返回 None。您的问题不是“为什么在我的屏幕上找不到图像”而是“为什么这里出现此错误”?我完美地回答了这个问题。
  • 但是图片在这里。我的目标是定位图片的位置,如果它引发错误,那么我编写这个脚本毫无意义。
  • 由于我无法对您的帖子发表评论,因此我将在这里回答您的最新问题,您不是在屏幕上寻找 png 或 jpeg。你在寻找真实的东西。 png 只是您屏幕上的内容的表示。
  • 那么您在问题中表达的目标非常糟糕。我建议在您的 cmets 中遵循 Ignacio 的建议,并以无损格式捕获图像并尝试找到它。该库清楚地告诉您,您的屏幕不包含您指定的图像。
【解决方案2】:

简化 事情 - locateCenterOnScreen() 方法应该返回图像的中心 (x,y) 坐标,如您所称的 'who.jpg' 仅当它存在于屏幕上。否则,如果在屏幕上找不到“who.jpg”图像 - 该方法应该返回“NONE”。

您不能将“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!")

【讨论】:

    【解决方案3】:

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

    因此,请尝试以下代码。

    导入 pyautogui 进口时间

    time.sleep(2)

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

    你将能够解决你的困难。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 2012-08-25
      • 1970-01-01
      • 2017-08-29
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多