解决Python报错:AttributeError: 'PhotoImage' object has no attribute 'crop'
问题解决
报错原因
crop()是PIL库中Image类的原生方法,你在调用crop()前已经把处理好的图像转成了ImageTk.PhotoImage类型,该类型是Tkinter专用的图像封装类,仅用于给Tkinter控件传递显示资源,不包含任何图像处理能力,因此触发属性不存在的报错。
修复逻辑
所有裁剪、滤镜、亮度调整等图像处理操作,必须在Image类型的对象上完成,全部处理结束后再转为PhotoImage类型用于界面渲染。
注意:原代码中用
filter作为变量名会覆盖Python内置的filter()函数,属于不规范写法,修正时已替换为bright_enhance,同时删除了重复生成亮度调整后图像的冗余代码。
修正后可用代码
import pyautogui from PIL import ImageFilter, ImageEnhance, ImageTk import tkinter as tk from tkinter import Label # 基础坐标参数 x = 3 y = 37 left = 155 top = 65 right = 360 bottom = 270 # 截图+图像处理(全程操作Image类型对象) ss = pyautogui.screenshot(region=(x, y, 1950, 1200)) blurImage = ss.filter(ImageFilter.GaussianBlur(radius=15)) bright_enhance = ImageEnhance.Brightness(blurImage) brightImage = bright_enhance.enhance(0.7) # 先裁剪再转格式 cropped_image = brightImage.crop((left, top, right, bottom)) # 所有图像处理完成后统一转为Tkinter可用的PhotoImage格式 full_screen_tk = ImageTk.PhotoImage(brightImage) cropped_tk = ImageTk.PhotoImage(cropped_image) # 界面渲染 root = tk.Tk() root.state('zoomed') # 全屏背景图 image1 = tk.Label(root, image=full_screen_tk) image1.image = full_screen_tk image1.place(x=0, y=0) # 裁剪后小图 image2 = Label(root, image=cropped_tk) image2.image = cropped_tk image2.place(x=35, y=35) root.mainloop()
内容的提问来源于stack exchange,提问作者Advait Bhore
相关产品推荐
相关产品推荐

