Загрузите изображение с помощью Tkinter в Python

Должно быть, я что-то упускаю, потому что мой код не работает:

у меня есть эти 2 функции в классе compaClass:

def drawImgs(self):
    canvas1.delete("all")
    canvas1.create_image(0, 0, anchor=NW, image=newImg1)

def loadImg(self):
    global newImg1
    ...
    newImg1 = ImageTk.PhotoImage(resized_image1)

Эта штука работала хорошо, но я подумал: зачем использовать переменную вне класса? Почему бы не использовать для этого переменную compaClass.img? Он должен быть всегда доступен, не объявляя его глобально. Поэтому я заменил newImg на self.img1. Теперь он ничего не рисует, никаких ошибок не возвращает — очень похоже на оригинал без глобальных newImg1.

Есть какие-нибудь предложения о том, что я пропустил?

def drawImgs(self):
    canvas1.delete("all")
    canvas1.create_image(0, 0, anchor=NW, image=self.img1)

def loadImg(self):
    global newImg1
    ...
    self.img1 = ImageTk.PhotoImage(resized_image1)

Трудно выявить проблему без минимального воспроизводимого примера.

acw1668 15.04.2024 08:33

Не могли бы вы отметить ответ как правильный, если это действительно так? 😅

Laszlo Hunyadi 16.04.2024 13:27
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Изображение, созданное с помощью ImageTk.PhotoImage и присвоенное переменной, локальной для функции или метода, подлежит сборке мусора, если ссылка на объект изображения не существует.

  1. Убедитесь, что compaClass хранится в переменной столько, сколько необходимо.
  2. Инициализируйте self.img1 в конструкторе вашего класса и обновите его в loadImg().

Пересмотренный код:

import tkinter as tk
from tkinter import Canvas
from PIL import Image, ImageTk
class CompaClass:
    def __init__(self, root):
        self.root = root
        self.canvas = Canvas(root, width=400, height=400)
        self.canvas.pack()
        self.img1 = None
    def draw_imgs(self):
        self.canvas.delete("all")
        if self.img1:
            self.canvas.create_image(0, 0, anchor=tk.NW, image=self.img1)
        else:
            print("No image has been loaded")
    def load_img(self, image_path):
        image = Image.open(image_path)
        resized_image = image.resize((400, 400))
        self.img1 = ImageTk.PhotoImage(resized_image)
        self.draw_imgs()
root = tk.Tk() 
app = CompaClass(root)
app.load_img('your_path_to_the_image.jpg')
root.mainloop()

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