点击按钮显示滤镜处理后图片报_tkinter.TclError错误如何解决
问题解决方案
报错原因
- Tkinter的
Label组件的image参数仅支持PIL.ImageTk.PhotoImage类型的对象,你代码里直接传入了cv2.blur返回的numpy数组,格式不匹配。 - Tkinter不会主动保留PhotoImage对象的引用,如果你将PhotoImage定义为函数内的局部变量,函数执行完毕后对象会被垃圾回收,导致Label无法找到对应的图像资源,也会触发这个报错。
修复后的代码
from tkinter import * import cv2 import numpy as np from PIL import ImageTk,Image root=Tk() root.title("image processing") original_image=ImageTk.PhotoImage(Image.open("E:/college materials/third year first term/image processing/section/noised_image.png")) original_image_for_filter=cv2.imread("E:/college materials/third year first term/image processing/section/noised_image.png") image_label=Label(image=original_image) image_label.grid(row=0,column=0) def button_Blur(): filtered_image_cv = cv2.blur(original_image_for_filter,(5,5)) # 转换cv2默认的BGR通道为PIL需要的RGB通道,避免颜色偏移 filtered_image_rgb = cv2.cvtColor(filtered_image_cv, cv2.COLOR_BGR2RGB) # 把numpy数组转为PIL Image对象,再封装为Tkinter支持的PhotoImage filtered_image_pil = Image.fromarray(filtered_image_rgb) filtered_image = ImageTk.PhotoImage(filtered_image_pil) image_label_filtered=Label(image=filtered_image) # 手动绑定图像到Label属性,保留引用避免被垃圾回收 image_label_filtered.image = filtered_image image_label_filtered.grid(row =0, column=1) button_blur=Button(root,text="apply blur filter",command=button_Blur) button_blur.grid(row=1,column=0) root.mainloop()
内容的提问来源于stack exchange,提问作者Aya Ibrahim
相关产品推荐
相关产品推荐

