Помеченный объект изображения не существует

Я получаю картинки из википедии в классе и добавляю их в дикт, когда я хочу вернуть его и добавить результат в изображение метки, я получаю ошибку

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()

Ошибка

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта ошибка связана с тем, что после возврата из функции 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):
        .
        .

Используя эти изменения, ваша проблема будет решена.

Другие вопросы по теме

Заполните родительский контейнер и уменьшите разрешение изображения с помощью next/image
Преобразуйте серию изображений в массив с помощью OpenCV и преобразуйте массив RGB в шкалу серого
Отображать и РЕДАКТИРОВАТЬ изображение opencv с помощью Tkinter
Как сопоставить размер изображения PNG между ручным выполнением чанка и вязанием файла с помощью Knitr и ggsave
Сегментация изображения без маркировки
Какой «Тип значка» выбрать для обычных изображений, которые будут использоваться в приложении для Android? Как мне добавить их как ImageViews?
Почему я не могу применять эффекты к изображениям в папке Cloudinary?
Я дал правильный отступ в pubspec с правильным путем к изображению и без каких-либо орфографических ошибок, но мои изображения не загружаются (я новичок в флаттере)
Объединение двух фонов в один
Будет ли изображение PNG терять качество при изменении размера с помощью HTML или APP