为啥 pyautogui.click() 返回类型错误?

Posted

技术标签:

【中文标题】为啥 pyautogui.click() 返回类型错误?【英文标题】:Why does pyautogui.click() return a Type Error?为什么 pyautogui.click() 返回类型错误? 【发布时间】:2022-01-14 19:48:56 【问题描述】:

我正在尝试制作一个可以检测眼睛是睁着还是闭着的脚本。我正在使用下面的代码来做到这一点。

https://github.com/balajisrinivas/Color-Detection-OpenCV

感谢 balajisrinivas 提供代码!

使用此代码,我可以添加实时视频捕获并创建单个图像,该图像在 while 循环中每 2 秒刷新一次,而不是单个图像(以 colorpic.jpg 为例)。另外,我这样做是为了如果颜色是棕色或 RGB 接近棕色,计算机会发出哔哔声,但如果颜色是白色、黑色或你的虹膜颜色,那么它就会知道你的眼睛没有闭上。有一个问题。问题是我必须单击图像才能获得结果,但我希望它自动发生。所以,我在while True: 循环中使用了pyautogui.locateOnScreen(‘needle.jpg’, confidence=0.8) 而不是if clicked。图片“needle..jpg”是我眼睛的照片。之后我添加了pyautogui.click(‘needle.jpg’),它将单击图片的中心,并在没有手动单击的情况下给我睁开或闭上眼睛的结果。

我卡住的地方:


while True:

    cv2.imshow("image", img)
    if pyautogui.locateOnScreen('needle.jpg', confidence=0.8):
        pyautogui.click('needle.jpg')

        # cv2.rectangle(image, start point, endpoint, color, thickness)-1 fills entire rectangle
        cv2.rectangle(img, (20, 20), (750, 60), (b, g, r), -1)

        # Creating text string to display( Color name and RGB values )
        text = get_color_name(r, g, b) + ' R=' + str(r) + \
            ' G=' + str(g) + ' B=' + str(b)

之前的代码是:

while True:

    cv2.imshow("image", img)
    if clicked:

        # cv2.rectangle(image, start point, endpoint, color, thickness)-1 fills entire rectangle
        cv2.rectangle(img, (20, 20), (750, 60), (b, g, r), -1)

        # Creating text string to display( Color name and RGB values )
        text = get_color_name(r, g, b) + ' R=' + str(r) + \
            ' G=' + str(g) + ' B=' + str(b)

唯一的问题是我遇到了类型错误。

这是错误:

Traceback (most recent call last):
  File "C:\Users\user1\Desktop\Color-Detection-OpenCV\hello.py", line 89, in <module>
    pyautogui.click('needle.jpg')
 line 598, in wrapper
    returnVal = wrappedFunction(*args, **kwargs)
  File "C:\Users\user1\AppData\Local\Programs\Python\Python39\lib\site-packages\pyautogui\__init__.py", line 980, in click
    x, y = _normalizeXYArgs(x, y)
TypeError: cannot unpack non-iterable NoneType object

只是为了让您知道我是 python 的新手,我是一名学生。如果您知道为什么我收到此错误的答案,请帮助我。谢谢!

【问题讨论】:

能否提供自己代码的相关部分?我可以告诉你错误地使用了locateOnScreenclick,但是如果代码不可用,很难解释你应该做什么。 【参考方案1】:

看起来这只是 pyautogui 的有意疏忽。因为我们已经知道图片在您的locateOnScreen 调用中的位置,所以为什么我们在点击时再次搜索。

来自他们的源代码:

def _normalizeXYArgs(firstArg, secondArg):
    # skip
    
    elif isinstance(firstArg, str):
        # If x is a string, we assume it's an image filename to locate on the screen:
        try:
            location = locateOnScreen(firstArg)
            # The following code only runs if pyscreeze.USE_IMAGE_NOT_FOUND_EXCEPTION is not set to True, meaning that
            # locateOnScreen() returns None if the image can't be found.
            if location is not None:
                return center(location)
            else:
                return None
# skipping lines past this

最后我们看到评论说 locateOnScreen 如果找不到图像,则返回 None。

对于您对locateOnScreen 的调用,您通过了confidence=0.8,但默认置信度为0.999

因此找到了 0.8 的置信度图像,但没有找到 0.999。因此,它将None 返回到location,然后它导致 if 块返回 None - 这是不可解包的。

由于我目前在移动设备上,我无法测试自己,但我敢打赌 locateOnScreen 在匹配时返回 x, y 坐标。

所以试着把 if 块改成这样。

try:
    x, y = pyautogui.locateOnScreen( ~~~ )
except TypeError:
    # value unpack failed, so we got None. Therefore no image matched.
    # therefore no x exist.
    # Put things you want to do when there's NO image matched.
    pass
else:
    # Put things you want to do when image matched.
    pyautogui.click(x, y)

强烈建议阅读Error handling part的官方文档。

【讨论】:

感谢您的帮助!我试过你上面提到的,但我仍然收到错误。 ` C:\Users\nahal\Desktop\Color-Detection-OpenCV>python test#2.py Traceback(最近一次调用最后):文件“C:\Users\nahal\Desktop\Color-Detection-OpenCV\test#2 .py",第 70 行,在 x, y = pyautogui.locateOnScreen('needle.jpg') TypeError: cannot unpack non-iterable NoneType object ' 对了,把except ValueError改成except TypeError 这是我的代码。 while True: cv2.imshow("image", img) try: x, y = pyautogui.locateOnScreen('face_image_eyes.jpg') except TypeError: # value unpack failed, so we got None.因此没有匹配的图像。 print('no image') pyautogui.click(x, y) # do other things 我仍然得到一个不同的错误。没有图像 Traceback(最近一次调用最后一次):文件“C:\hello.py”,第 78 行,在 pyautogui.click(x, y) NameError: name 'x' is not defined 您是否 100% 确定您遵循了代码?如果有类型错误,那么它应该返回并爆发,而不是继续执行。该 try-except 基本上是替换if 块,否则程序将尝试使用未定义的值x。为了更清晰,我再次更新了代码。 我在使用 else 语句并使用 pass 后使其工作。非常感谢您的帮助!

以上是关于为啥 pyautogui.click() 返回类型错误?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试使用 pyautogui click 功能运行我的代码时出现错误

Pyautogui click不会注册我桌面上应用程序窗口的点击

pyautogui自动化办公脚本

Pyautogui 无法在 Roblox 中正确移动鼠标

为啥 GetQueuedCompletionStatus() 不返回操作类型?

为啥 lambda 函数默认会丢弃推导的返回类型引用?