Как отобразить новое изображение после некоторой временной задержки под старым изображением, которое уже отображается в окне tkinter?

#python #python-3.x #tkinter #canvas #tkinter-canvas

#python #python-3.x #tkinter #холст #tkinter-canvas

Вопрос:

Я хочу отобразить два изображения pic1.png и pic2.png на холсте с помощью tkinter. Первое изображение ( pic2.png ) уже будет отображаться в окне tkinter. Однако второе изображение ( pic1.png ) появится через 1 секунду и будет позади первого изображения.

Для достижения этой цели я написал этот код,

 from tkinter import *
from PIL import Image, ImageTk

root = Tk()

frame = Frame(root)
frame.pack()

canvas = Canvas(frame, width=250, height=250, bd=0, highlightthickness=0, relief='ridge')
canvas.pack()

my_pic1 = PhotoImage(file="my_pic1.png")
frame.after(1000, lambda : canvas.create_image(50,50,image=my_pic1, anchor=NW, tag="A"))

my_pic2 = PhotoImage(file="my_pic2.png")
canvas.create_image(50,50,image=my_pic2, anchor=NW, tags="B")

canvas.tag_raise("B")
canvas.tag_lower("A")

root.mainloop()
 

Но у меня возникает проблема с размещением второго изображения ( pic1.png ) за первым изображением ( pic2.png ). Чего я добиваюсь, так это того, что второе изображение ( pic1.png ) появляется над первым изображением ( pic2.png ). Пожалуйста, помогите мне в моем коде.

Комментарии:

1. позади? Вы имеете в виду, что 1-е изображение будет покрывать второе изображение?

2. Да, точно! Размер второго изображения немного больше по сравнению с первым изображением, поэтому оно будет видно, даже если оно находится за первым изображением.

Ответ №1:

При canvas.tag_lower("A") выполнении изображение с тегом «A» еще не создано, поскольку его планируется создать на одну секунду позже.

Вы должны вызвать его после создания изображения:

 frame.after(1000, lambda: (canvas.create_image(50,50,image=my_pic1, anchor=NW, tag="A"), canvas.tag_lower("A")))
 

Комментарии:

1. Огромное спасибо! Это работает! Но когда я добавляю фоновое изображение в canvas, изображение с тегом «A» отображается даже за фоновым изображением и не может отображаться. Что делать в этом случае?

2. Используйте canvas.tag_lower("A", "B") , чтобы сделать «A» ниже «B».

3. Удивительно! Большое вам спасибо!