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 Nonelightningloc[0]中的[0]被称为下标。错误消息告诉您您试图下标 NoneType 的值。 lightningloc 是被下标的变量。 None 是唯一具有 NoneType 类型的值,因此 lightninglocNone。尝试调用 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)