为什么 pyautogui 无法定位我的图像,尽管代码似乎很好?

问题描述

所以我的程序应该做的是在认应用程序窗口中找到 Mozilla Firefox,然后点击它并将其更改为 Brave browser。尽管我查看了文档,但我看到代码中的所有内容都应该如此,但我不断收到此错误

File "g:\Default-browser\main.py",line 9,in <module>
    x,y = pyautogui.locateCenterOnScreen('G:\Default-browser\mozilla.png')
TypeError: cannot unpack non-iterable nonetype object

这是我的代码

import pyautogui 
from time import sleep

pyautogui.press("win")
sleep(.2)
pyautogui.typewrite("default")
sleep(.1)
pyautogui.press("enter")
x,y = pyautogui.locateCenterOnScreen('G:\Default-browser\mozilla.png')
pyautogui.moveto(x,y)
pyautogui.click(x,y)
sleep(.3)
x,y = pyautogui.locateCenterOnScreen(['G:\\Default-browser\\brave.png'])
pyautogui.click(x,y)
pyautogui.hotkey('alt','f4')
quit()

解决方法

未检测到图像,因此 python 无法解压变量。您的代码只运行一次图像检测,并且当尝试自动执行加载时间可能因动画、计算机速度等而异的 GUI 过程时,只检测一次通常不是一个好主意。此外,它不是 100% 可靠的,它可能需要多次尝试。我总是在自动化流程时使用循环,直到检测到图像。您可以创建如下函数:

def detect_image(path,duration=0):
    while True:
        image_location = pyautogui.locateCenterOnScreen(path)
        if image_location:
            pyautogui.click(image_location[0],image_location[1],duration=duration)
            break

有了这个,你就不会得到那个错误,而且,如果它需要很长时间并且由于某种原因没有找到图像,那么你应该重新截图。

另一方面,如果您认为图像每次都会略有不同,则可以在 confidence 方法中使用 pyautogui.locateCenterOnScreen 参数。置信度越低,就越有可能检测到更多不同的图像。但是,如果您将置信度设置得太低,它可能会检测到误报(不是您实际要查找的图像)。所以你应该意识到,降低信心会产生一些问题。代码如下:

pyautogui.locateCenterOnScreen('image.png',confidence=0.5)

请记住,为了使用此功能,您必须使用以下 pip 命令安装 opencv:pip install opencv-python

最后,如果您想从图片中移除颜色,并检测始终保持不变但颜色发生变化的图像,那么您可以将 grayscale 参数传递给 pyautogui 检测方法,然后将图像转换为黑白,然后进行检测。就像这样:

pyautogui.locateCenterOnScreen('image.png',grayscale=True)