Должно быть, я что-то упускаю, потому что мой код не работает:
у меня есть эти 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)
Не могли бы вы отметить ответ как правильный, если это действительно так? 😅






Изображение, созданное с помощью ImageTk.PhotoImage и присвоенное переменной, локальной для функции или метода, подлежит сборке мусора, если ссылка на объект изображения не существует.
compaClass хранится в переменной столько, сколько необходимо.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()
Трудно выявить проблему без минимального воспроизводимого примера.