import tkinter as tk
from PIL import ImageTk, Image
window = tk.Tk()
window.geometry("300x300")
canvas = tk.Canvas(window, width=300, height=300,bg = "red")
canvas.pack()
class Button():
def __init__(self, x, y, canv):
self.img = ImageTk.PhotoImage(Image.open("Hover.png"))
canv.create_image(x, y, image=self.img, anchor = "nw")
Button(0, 0, canvas)
window.mainloop()
Я пытаюсь отобразить изображение в Python, используя опцию холста tkinter. Однако, если я введу его в класс, как показано ниже, это не выдаст ошибку, но и не отобразит мое изображение. Пожалуйста, решите это для меня, не помещая холст внутрь класса.






Убедитесь, что путь к изображению правильный.
Добавьте self.canv = canv к __init__:
import tkinter as tk
from PIL import ImageTk, Image
class Button:
def __init__(self, x, y, canv):
self.img = ImageTk.PhotoImage(Image.open("Hover.png"))
self.canv = canv
self.canv.create_image(x, y, image=self.img, anchor = "nw")
self.canv.image = self.img
window = tk.Tk()
window.geometry("300x300")
canv = tk.Canvas(window, width=300, height=300, bg = "red")
canv.pack()
Button(0, 0, canv)
window.mainloop()
Вы также можете стилизовать его, задав положение и масштаб:
import tkinter as tk
from PIL import ImageTk, Image
class Button:
def __init__(self, x, y, canv, img_path, scale=100):
self.canv = canv
self.img_path = img_path
self.scale = scale / 100.0
self.set_scale()
self.border = self.canv.create_rectangle(
x - 5,
y - 5,
x + self.img.width() + 5,
y + self.img.height() + 5,
outline = "white", width=5)
self.img_id = self.canv.create_image(x, y, image=self.img, anchor = "nw")
self.canv.tag_bind(self.img_id, "<Enter>", self.hover)
self.canv.tag_bind(self.img_id, "<Leave>", self.unhover)
def set_scale(self):
orig = Image.open(self.img_path)
w, h = orig.size
sw, sh = int(w * self.scale), int(h * self.scale)
resized = orig.resize((sw, sh), Image.LANCZOS)
self.img = ImageTk.PhotoImage(resized)
def set_pos(self, x, y):
self.canv.coords(self.img_id, x, y)
self.canv.coords(self.border, x - 5, y - 5, x + self.img.width() + 5, y + self.img.height() + 5)
def hover(self, event):
self.canv.itemconfig(self.border, outline = "yellow")
def unhover(self, event):
self.canv.itemconfig(self.border, outline = "white")
window = tk.Tk()
window.geometry("300x300")
canv = tk.Canvas(window, width=300, height=300, bg = "red")
canv.pack()
button = Button(0, 0, canv, "hover.png", 30)
button.set_pos(25, 25)
window.mainloop()
Я пытаюсь отобразить изображение в Python, используя холст tkinter. вариант. Однако, если я введу его в класс, как показано ниже, это не даст ошибка, но мое изображение также не отображается
Проблема может быть решена.
Просто добавьте строку 13.
canv.image = self.img
Фрагмент:
class Button():
def __init__(self, x, y, canv):
self.img = ImageTk.PhotoImage(Image.open("Hover.png"))
canv.create_image(x, y, image=self.img, anchor = "nw")
canv.image = self.img
Скриншот:
Поскольку переменная, ссылающаяся на экземпляр класса, отсутствует, экземпляр класса будет подвергнут сборке мусора и, следовательно, к изображению, созданному внутри экземпляра класса.
Просто сохраните ссылки на экземпляры класса:
img1 = Button(0, 0, canvas)
img2 = Button(50, 50, canvas)
Вам необходимо сохранить ссылку на экземпляр класса, чтобы избежать сборки мусора, например
img1 = Button(...).