如何使用.after()依次显示一个图像

时间:2019-09-02 21:54:56

标签: python image tkinter window draw

我正在尝试根据短语在窗口上显示图像。如果短语中的字符与图片名称匹配,则应在窗口上显示该图片。如果该短语有多个字符,则与当前字符之后的字符相关的图片应显示在当前字符图片的右侧。我如何才能使新的并排图片二重奏出现,这次显示与左侧第二个字符和右侧第三个字符相关的图片,依此类推?我尝试使用.after(),但不确定在哪里放置。

另外,当我运行以下代码时,除非使用break语句,否则我得到的索引超出范围错误。但是我似乎无法弄清楚它是什么。也许使用after()方法可以解决此问题?

import tkinter as tk
from PIL import ImageTk, Image, ImageDraw, ImageFont
import time


def open_image():
    global i
    global image
    global img
    global image2
    global img2

    if i < len(phrase):

        if phrase[i] == " ":
            image = Image.open("Rest.jpg")
            img = ImageTk.PhotoImage(image)
            panel['image'] = img
        else:
            image = Image.open(phrase[i] + ".jpg")
            img = ImageTk.PhotoImage(image)
            panel['image'] = img
        if phrase[i + 1] != None and phrase[i + 1] != " ":
            image2 = Image.open(phrase[i + 1] + ".jpg")
            panel2['image2'] = img2
        else:
            image2 = Image.open("Rest1.jpg")
            panel2['image2'] = img2

        i += 1
        window.after(2000, open_image)
    else:
        window.destroy()

# --- main ---

i = 0
phrase = " trac "

window = tk.Tk()

panel = tk.Label(window) # without image
panel.pack(side = "left", fill = "both", expand = "1", padx = 5, pady = 5)
panel2 = tk.Label(window)
panel2.pack(side = "left", fill = "both", expand = "1", padx = 5, pady = 5)                 

# use it after creating Label so it can set image 
open_image()

window.mainloop()

1 个答案:

答案 0 :(得分:0)

我简化了代码以创建工作示例。

after()使用的函数名不包含()

open_image()加载图像,分配给全局变量(以解决PhotoImage中的错误问题)并更改Label中的图像

在开始时,我创建了Label,但没有图像,open_image()添加了第一张图像,然后将其更改为新图像。

import tkinter as tk
from PIL import Image, ImageTk

# --- functions ---

def open_image():
    global i
    global image
    global img 

    if i < len(phrase): # check at the beginning to resolve problem with `IndexError: list index out of range`

        image = Image.open(phrase[i] + ".jpg")
        img = ImageTk.PhotoImage(image)
        panel['image'] = img

        i += 1
        window.after(2000, open_image)
    else:
        #window.quit()
        window.destroy()

# --- main ---

i = 0
phrase = " trac "

window = tk.Tk()

panel = tk.Label(window) # without image
panel.pack()

# use it after creating Label so it can set image in existing label
open_image()

window.mainloop()