标记的图像对象不存在
labelled image object doesn't exist
我从 class 中的维基百科获取图片并将它们添加到字典中,当我想 return 它并将结果添加到标签图像时,我得到一个错误
import tkinter as tk
import urllib.request
from PIL import Image, ImageTk
from io import BytesIO
import time
image_dat = {}
class add:
def __init__(self, url):
self.test(url)
def test(self, url):
if url not in image_dat.keys():
u = urllib.request.urlopen(url)
raw_data = u.read()
u.close()
im = Image.open(BytesIO(raw_data))
im = im.resize((25, 25), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(im)
photo.im = photo
image_dat[url] = photo
return image_dat[url]
if __name__ == '__main__':
root = tk.Tk()
label = tk.Label()
label.pack()
img = add("https://upload.wikimedia.org/wikipedia/commons/f/fb/Check-Logo.png")
label['image'] = img
tk.mainloop()
Error
这个错误是因为在从 test
函数 returning 之后,图像对象没有被 add
[=31] 的构造函数 returned =].
例如,只是为了测试,如果在 test
函数中这样做:
.
.
photo.im = photo
image_dat[url] = photo
#if created a label here with that image, it will work fine:
label = tk.Label(root, image=image_dat[url])
label.pack()
这样你就不会出错。这表明在 test
函数中编写的代码一切正常。
因此,为了修复问题中给出的代码:
因为,构造函数__init__()
只能return None,如果你想在class被调用时return其他对象,那么使用 __new__()
方法。
.
.
class add:
def __new__(cls, url):
return cls.test(url)
def test(url):
.
.
使用这些更改,您的问题得到解决。
我从 class 中的维基百科获取图片并将它们添加到字典中,当我想 return 它并将结果添加到标签图像时,我得到一个错误
import tkinter as tk
import urllib.request
from PIL import Image, ImageTk
from io import BytesIO
import time
image_dat = {}
class add:
def __init__(self, url):
self.test(url)
def test(self, url):
if url not in image_dat.keys():
u = urllib.request.urlopen(url)
raw_data = u.read()
u.close()
im = Image.open(BytesIO(raw_data))
im = im.resize((25, 25), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(im)
photo.im = photo
image_dat[url] = photo
return image_dat[url]
if __name__ == '__main__':
root = tk.Tk()
label = tk.Label()
label.pack()
img = add("https://upload.wikimedia.org/wikipedia/commons/f/fb/Check-Logo.png")
label['image'] = img
tk.mainloop()
Error
这个错误是因为在从 test
函数 returning 之后,图像对象没有被 add
[=31] 的构造函数 returned =].
例如,只是为了测试,如果在 test
函数中这样做:
.
.
photo.im = photo
image_dat[url] = photo
#if created a label here with that image, it will work fine:
label = tk.Label(root, image=image_dat[url])
label.pack()
这样你就不会出错。这表明在 test
函数中编写的代码一切正常。
因此,为了修复问题中给出的代码:
因为,构造函数__init__()
只能return None,如果你想在class被调用时return其他对象,那么使用 __new__()
方法。
.
.
class add:
def __new__(cls, url):
return cls.test(url)
def test(url):
.
.
使用这些更改,您的问题得到解决。