Я получаю картинки из википедии в классе и добавляю их в дикт, когда я хочу вернуть его и добавить результат в изображение метки, я получаю ошибку
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()
Эта ошибка связана с тем, что после возврата из функции test
объект изображения не возвращается конструктором класса add
.
Например, просто для проверки, если сделать так в функции 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__()
может возвращать только None, если вы хотите вернуть какой-то другой объект при вызове класса, используйте метод __new__()
.
.
.
class add:
def __new__(cls, url):
return cls.test(url)
def test(url):
.
.
Используя эти изменения, ваша проблема будет решена.