标记的图像对象不存在

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):
        .
        .

使用这些更改,您的问题得到解决。