微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

屏幕搜索和 pyautogui 图像问题'NoneType' 对象没有属性 'shape'

如何解决屏幕搜索和 pyautogui 图像问题'NoneType' 对象没有属性 'shape'

所以我在屏幕搜索pyautogui 方面都遇到了问题。

这里是屏幕搜索

from screen_search import *

search = Search("windows.jpg")

pos = search.imagesearch()

if pos[0] != -1:
    print("position : ",pos[0],pos[1])
    pyautogui.moveto(pos[0],pos[1])
else:
    print("image not found")

完全错误

  File "d:stuff",line 5,in <module>
    pos = search.imagesearch()
  File "C:\Users\AppData\Local\Programs\Python\python39\lib\site-packages\screen_search\screen_search.py",line 35,in imagesearch
    template.shape[::-1]

我一直收到这个错误nonetype”对象没有属性“形状” 我决定改用 pyautogui 并做到了。

from pyautogui import *

def main():

    print(locateOnScreen('windows.jpg',confidence = 0.5))

main()

我仍然收到错误消息。

Failed to read windows.jpg because file is missing,has improper permissions,or is an unsupported or invalid format.

解决方法

简答:

很可能,文件 windows.jpg 不在 python 的当前工作目录中,但可能有其他原因。

查看我的答案末尾的代码片段,执行它,您可能会发现问题:

长答案: 您遇到的问题是,screen_search 提供的错误消息相当无用且没有太大帮助。

Traceback (most recent call last):
  File "xxxx.py",line 14,in <module>
    main()
  File "xxxx.py",line 10,in main
    pos = search.imagesearch()
  File "..../lib/python3.9/site-packages/screen_search/screen_search.py",line 35,in imagesearch
    template.shape[::-1]

然而,您的第二个代码片段的信息更具建设性:

Traceback (most recent call last):
  File "xxx.py",line 13,in <module>
    main()
  File "xxx.py",line 9,in main
    pos = locateOnScreen(fname,confidence = 0.5)
  File ".../lib/python3.9/site-packages/pyautogui/__init__.py",line 175,in wrapper
    return wrappedFunction(*args,**kwargs)
  File ".../lib/python3.9/site-packages/pyautogui/__init__.py",line 213,in locateOnScreen
    return pyscreeze.locateOnScreen(*args,**kwargs)
  File ".../lib/python3.9/site-packages/pyscreeze/__init__.py",line 360,in locateOnScreen
    retVal = locate(image,screenshotIm,line 340,in locate
    points = tuple(locateAll(needleImage,haystackImage,**kwargs))
  File ".../lib/python3.9/site-packages/pyscreeze/__init__.py",line 197,in _locateAll_opencv
    needleImage = _load_cv2(needleImage,grayscale)
  File ".../lib/python3.9/site-packages/pyscreeze/__init__.py",line 160,in _load_cv2
    raise IOError("Failed to read %s because file is missing,"
OSError: Failed to read windows.jpg because file is missing,has improper permissions,or is an unsupported or invalid format

它告诉你, OSError:无法读取 windows.jpg,因为文件丢失、权限不正确或者格式不受支持或无效

所以你必须检查文件windows.jpg是否真的存在(在你指定的相对路径的当前工作目录中)

如果确实存在,请检查该文件是否可以读取,如果情况也是如此,请检查该文件是否确实是 jpeg 文件并且可以使用图像查看应用程序打开。

我猜,该文件存在,是可读的,而且它确实是一个 jpeg 文件,但它不在当前工作目录中。

import os
import sys
from PIL import Image

from screen_search import *

fname = "windows.jpg"
current_working_directory = os.getcwd()
print("My current working directory is",current_working_directory)

absolute_fname = os.path.realpath(fname)
print("the image file name is",fname)
print("the absolute file name",os.path.realpath(fname))
if not os.path.exists(absolute_fname):
    print("cannot find file",absolute_fname)
    sys.exit(1)
if not os.path.isfile(absolute_fname):
    print(absolute_fname,"exists,but is no file")
    sys.exit(1)
if not os.access(absolute_fname,os.R_OK):
    print("the file",absolute_fname,"is not readable")
    sys.exit(1)
try:
    img = Image.open(fname)
except OSError:
    print("The readable file","doesn't seem to contain valid data")
    sys.exit(1)

search = Search(absolute_fname)

pos = search.imagesearch()

if pos[0] != -1:
    print("position : ",pos[0],pos[1])
    pyautogui.moveTo(pos[0],pos[1])
else:
    print("image not found")

Windows 用户附录:

Windows 有一个非常烦人的习惯,就是在 Windows 资源管理器中不显示文件扩展名。这令人困惑。

Windows 默认设置也是如此。 如果 jpg 文件显示为 windows,则其真实名称为 windows.jpg 如果显示为windows.jpg,其真实姓名将为windows.jpg.jpg

为了阻止这种烦人的 Windows 行为,我建议设置 Windows 资源管理器以显示文件扩展名。 ( https://www.howtogeek.com/205086/beginner-how-to-make-windows-show-file-extensions/ )

,

我改变了一些东西,它现在起作用了,我知道为什么它起作用了,但它确实起作用了

windows = Image.open(r"C:\Users\kaleb\Pictures\Photo recognition albion\windows.png")

然后我没有使用 windows.png,而是使用 windows,现在它可以正常工作了

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。