Есть ли способ реализовать задержку на одном изображении? - PullRequest
0 голосов
/ 23 июня 2019

Небольшая программа, над которой я работаю с использованием python, предназначена для отображения серии изображений и аудиоклипов в определенном порядке. Я могу отобразить два изображения в одном и том же окне, одно накладывать на другое, как и предполагалось, но я ищу способ, чтобы второе изображение появилось через определенное время (30 секунд), а не сразу как программа запущена. Однако я не могу заставить второй образ, называемый textBox.jpg, запускаться отдельно от остальной программы.

Чтобы попытаться решить эту проблему, я вставил функцию sleep(), но это только задерживает запуск всего кода.

from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk
import time

# Title/Main
window = Tk()
window.title("Just Monika")
window.configure(background="black")

# control window size to make full-screen
width_value=window.winfo_screenwidth()
height_value=window.winfo_screenheight()
window.geometry("%dx%d+0+0" % (width_value, height_value))

# Monika photo
# this block will allow the image to resize to fit the window's size
# indefinitely
def resize_image(event):
    new_width = event.width
    new_height = event.height
    image = copy_of_image.resize((new_width, new_height))
    photo = ImageTk.PhotoImage(image)
    label.config(image = photo)
    label.image = photo #avoid garbage collection

monika = Image.open("C:\\Python Programs\\Just Monika\\Images\\justMonika.png")
copy_of_image = monika.copy()
photo = ImageTk.PhotoImage(monika)
label = ttk.Label(window, image = photo)
label.bind('<Configure>', resize_image)
label.pack(fill=BOTH, expand=YES)

# text box image
textBox = Image.open("C:\\Python Programs\\Just Monika\\Images\\textBox.jpg")
tkTextBox = ImageTk.PhotoImage(textBox)
panel1 = Label(window, image = tkTextBox)
panel1.place(x=675, y=300)
time.sleep(30)

Я хочу, чтобы второе изображение, textBox.jpg, вызывалось после того, как программа проработала около 30 секунд, а другое изображение уже было отображено.

1 Ответ

0 голосов
/ 23 июня 2019

Как предложил @Masoud, вы можете использовать универсальный метод виджета after(), чтобы запланировать функцию, которая будет вызываться после указанной задержки:

from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk


PATH_IMAGE1 = 'justMonika.png'
PATH_IMAGE2 = 'textBox.png'
DELAY = 5000  # In milliseconds

# Title/Main
window = Tk()
window.title("Just Monika")
window.configure(background="black")

# control window size to make full-screen
width_value=window.winfo_screenwidth()
height_value=window.winfo_screenheight()
window.geometry("%dx%d+0+0" % (width_value, height_value))


# Monika photo
# this block will allow the image to resize to fit the window's size
# indefinitely
def resize_image(event):
    new_width = event.width
    new_height = event.height
    image = copy_of_image.resize((new_width, new_height))
    photo = ImageTk.PhotoImage(image)
    label.config(image = photo)
    label.image = photo #avoid garbage collection

def display_2nd_image():
    global panel1

    # text box image
    textBox = Image.open(PATH_IMAGE2)
    tkTextBox = ImageTk.PhotoImage(textBox)
    panel1 = Label(window, image=tkTextBox)
    panel1.place(x=675, y=300)
    panel1.image = tkTextBox #avoid garbage collection

monika = Image.open(PATH_IMAGE1)
copy_of_image = monika.copy()
photo = ImageTk.PhotoImage(monika)
label = ttk.Label(window, image=photo)
label.bind('<Configure>', resize_image)
label.pack(fill=BOTH, expand=YES)

window.after(DELAY, display_2nd_image)
window.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...