上面的代码显示报错:PhotoImage' object has no attribute '_PhotoImage__photo'
时间: 2023-07-28 07:38:50 浏览: 283
这个错误通常是由于Python的垃圾回收机制导致的。在将PIL图像转换为Tkinter图像后,必须保留对Tkinter图像对象的引用,否则它可能会在垃圾回收期间被删除,导致该错误。要解决此问题,可以在创建Tkinter图像对象时将其作为实例变量存储在类中,或者将其作为全局变量存储。
以下是一个示例代码,使用实例变量来存储Tkinter图像对象:
```python
import cv2
from PIL import Image, ImageTk
import tkinter as tk
class App:
def __init__(self):
self.root = tk.Tk()
self.label = tk.Label(self.root)
self.label.pack()
self.img_tk = None
self.update_image()
def update_image(self):
# 读取图像
img = cv2.imread("example.jpg")
# 将图像从OpenCV格式转换为PIL格式
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_pil = Image.fromarray(img_rgb)
# 将PIL图像转换为Tkinter图像
self.img_tk = ImageTk.PhotoImage(img_pil)
# 在标签中显示图像
self.label.configure(image=self.img_tk)
# 每隔100毫秒更新一次图像
self.root.after(100, self.update_image)
app = App()
app.root.mainloop()
```
在这个示例代码中,我们使用一个类来管理Tkinter应用程序,并将Tkinter图像对象作为类的实例变量进行存储。在update_image方法中,我们读取图像,将其转换为Tkinter图像,并在Tkinter窗口中显示它。我们还使用Tkinter的after方法来定期更新图像。