为啥 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 的新手,我是一名学生。如果您知道为什么我收到此错误的答案,请帮助我。谢谢!
【问题讨论】:
能否提供自己代码的相关部分?我可以告诉你错误地使用了locateOnScreen
和click
,但是如果代码不可用,很难解释你应该做什么。
【参考方案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 行,在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 行,在 if
块,否则程序将尝试使用未定义的值x
。为了更清晰,我再次更新了代码。
我在使用 else 语句并使用 pass 后使其工作。非常感谢您的帮助!以上是关于为啥 pyautogui.click() 返回类型错误?的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试使用 pyautogui click 功能运行我的代码时出现错误
Pyautogui click不会注册我桌面上应用程序窗口的点击