我正在尝试使用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)
如何解决此问题?
答案 0 :(得分:7)
从Pyautogui here的文档中,当locCenterOnScreen无法在屏幕上找到图像时,它会返回None。
请注意,您正在寻找此方法的2个结果,但是None只是一个结果(因为该方法通常返回两个,这对我来说似乎是糟糕的设计 - 它应该引发异常,或者至少返回一个带有两个无对象的元组)。
请看下面的例子,基本上是你发生的事情:
>>> foo,bar = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable
在我看来,解决这个问题最简单,最恐怖的方法就是试着抓住它:
try:
buttonx,buttony = pyautogui.locateCenterOnScreen('who.jpg')
except TypeError:
""" Do something to handle the fact that the image was not found"""
编辑: 要回答您在评论中提出的问题,似乎对此库的工作原理或它在屏幕上发现的内容存在误解。您可以通过某些图像为库提供所需内容的表示。当图像无损时,它的效果要好得多,因为它是一个精确的,逐像素的表示。然后,库会在您的计算机屏幕上搜索所提供图像所代表的实际内容。当你提出问题时,它不会找到jpegs或pngs。它找到实际的渲染对象。因此,如果您在桌面上为网络浏览器拍摄了图标的屏幕截图,它将从该屏幕截图中找到实际图标并单击它,但前提是它是可见的。如果它在其他窗户或其他东西后面,它将找不到它。它不会在屏幕上搜索图标文件,而是搜索图标本身。因此,例如,如果您将实际的.ico文件提供给库,则如果它被另一个窗口覆盖,则无法找到该图标,即使该图标在桌面上技术上 ,因为它目前尚未呈现。
HTH
答案 1 :(得分:0)
要简化事物 - locateCenterOnScreen()方法应该返回图像的中心(x,y)坐标,因为你调用了#who; who.jpg&# 39;只有在屏幕上显示它。否则,如果&#39; who.jpg&#39;屏幕上找不到图像 - 方法应该返回&#39;无。&#39;
您无法分配“无”&#39;值为(x,y)坐标,因为你得到一个值(&#39; NONE&#39;)和两个等待接收某个值的变量。这就是为什么你得到一个&#34; TypeError&#34;。
尝试使用异常,这是在程序执行期间可能发生的事件 - &gt;例如TypeError。尝试预测在执行期间可能发生的其他事件,你将很高兴完成任务!
为了您的方便,请尝试以下代码:
try:
buttonx, buttony = pyautogui.locateCenterOnScreen('who.jpg')
pyautogui.click(buttonx, buttony)
except TypeError:
print("A TypeError has been occured!")
答案 2 :(得分:-2)
如果图像尺寸为1920x1080,则图像调用大约需要1或2秒。
因此,请尝试下面的代码。
导入pyautogui 导入时间
time.sleep(2)
buttonx,buttony = pyautogui.locateCenterOnScreen('who.jpg') pyautogui.doubleClick(buttonx,buttony)
您将能够解决您的困难。