问题描述
这里是屏幕搜索
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,现在它可以正常工作了