My PyAutoGUI script is raising TypeError: 'NoneType' object is not subscriptable after calling locateOnScreen()
My PyAutoGUI script is raising TypeError: 'NoneType' object is not subscriptable after calling locateOnScreen()
我编写了一个 python 程序,该程序截取屏幕截图并在给定区域中查找 .PNG 图像,如果有则单击该图片。我正在使用库 pyautogui。
while keyboard.is_pressed('q') == False:
pic = pyautogui.screenshot(region=(360,158,1900,1025))
width, height = pic.size
if pyautogui.locateOnScreen('greenlightning.png', region=(360,158,1900,1025), grayscale=True, confidence=0.8) != None:
lightningloc = pyautogui.locateOnScreen('greenlightning.png')
x = lightningloc[0]
y = lightningloc[1]
pyautogui.click(x, y - 50)
time.sleep(0.2)
else:
time.sleep(0.1)
问题是它有时会抛出一个类型错误,因为“x”或“y”是 'NoneType'。
File "C:\****\**\***\***\****.py", line 18, in <module>
x = lightningloc[0] TypeError: 'NoneType' object is not subscriptable
我只想让程序点击比我的图像坐标高 50 像素的像素 'greenlightning.png'
。你知道pyautogui.click()
函数吗?
我认为问题是第一次 locateOnScreen()
调用 returns 坐标但第二次调用 returns None
。 lightningloc[0]
中的[0]
被称为下标。错误消息告诉您您试图下标 NoneType
的值。 lightningloc
是被下标的变量。 None
是唯一具有 NoneType
类型的值,因此 lightningloc
是 None
。尝试调用 locateOnScreen()
一次并将其分配给一个变量,然后检查 None
,如下所示:
lightningloc = pyautogui.locateOnScreen('greenlightning.png', region=(360,158,1900,1025), grayscale=True, confidence=0.8)
if lightningloc is not None:
x = lightningloc[0]
y = lightningloc[1]
pyautogui.click(x, y - 50)
time.sleep(0.2)
else:
time.sleep(0.1)
第一次调用 locateOnScreen()
使用 confidence
关键字参数,允许模糊匹配(安装 OpenCV 时)。第二次调用它时,您没有传递此关键字参数,PyAutoGUI 正在尝试进行像素完美匹配。第二次调用未能找到像素完美匹配,因此它 returns None
稍后会导致错误。
您可以通过以下方式更改代码,使其不会对 locateOnScreen()
:
进行两次单独调用
while keyboard.is_pressed('q') == False:
pic = pyautogui.screenshot(region=(360,158,1900,1025))
width, height = pic.size
lightningloc = pyautogui.locateOnScreen('greenlightning.png', region=(360,158,1900,1025), grayscale=True, confidence=0.8)
if lightningloc is not None:
x = lightningloc[0]
y = lightningloc[1]
pyautogui.click(x, y - 50)
time.sleep(0.2)
else:
time.sleep(0.1)
我编写了一个 python 程序,该程序截取屏幕截图并在给定区域中查找 .PNG 图像,如果有则单击该图片。我正在使用库 pyautogui。
while keyboard.is_pressed('q') == False:
pic = pyautogui.screenshot(region=(360,158,1900,1025))
width, height = pic.size
if pyautogui.locateOnScreen('greenlightning.png', region=(360,158,1900,1025), grayscale=True, confidence=0.8) != None:
lightningloc = pyautogui.locateOnScreen('greenlightning.png')
x = lightningloc[0]
y = lightningloc[1]
pyautogui.click(x, y - 50)
time.sleep(0.2)
else:
time.sleep(0.1)
问题是它有时会抛出一个类型错误,因为“x”或“y”是 'NoneType'。
File "C:\****\**\***\***\****.py", line 18, in <module>
x = lightningloc[0] TypeError: 'NoneType' object is not subscriptable
我只想让程序点击比我的图像坐标高 50 像素的像素 'greenlightning.png'
。你知道pyautogui.click()
函数吗?
我认为问题是第一次 locateOnScreen()
调用 returns 坐标但第二次调用 returns None
。 lightningloc[0]
中的[0]
被称为下标。错误消息告诉您您试图下标 NoneType
的值。 lightningloc
是被下标的变量。 None
是唯一具有 NoneType
类型的值,因此 lightningloc
是 None
。尝试调用 locateOnScreen()
一次并将其分配给一个变量,然后检查 None
,如下所示:
lightningloc = pyautogui.locateOnScreen('greenlightning.png', region=(360,158,1900,1025), grayscale=True, confidence=0.8)
if lightningloc is not None:
x = lightningloc[0]
y = lightningloc[1]
pyautogui.click(x, y - 50)
time.sleep(0.2)
else:
time.sleep(0.1)
第一次调用 locateOnScreen()
使用 confidence
关键字参数,允许模糊匹配(安装 OpenCV 时)。第二次调用它时,您没有传递此关键字参数,PyAutoGUI 正在尝试进行像素完美匹配。第二次调用未能找到像素完美匹配,因此它 returns None
稍后会导致错误。
您可以通过以下方式更改代码,使其不会对 locateOnScreen()
:
while keyboard.is_pressed('q') == False:
pic = pyautogui.screenshot(region=(360,158,1900,1025))
width, height = pic.size
lightningloc = pyautogui.locateOnScreen('greenlightning.png', region=(360,158,1900,1025), grayscale=True, confidence=0.8)
if lightningloc is not None:
x = lightningloc[0]
y = lightningloc[1]
pyautogui.click(x, y - 50)
time.sleep(0.2)
else:
time.sleep(0.1)