Python 如何使用.after()一个接一个地显示图像

Python 如何使用.after()一个接一个地显示图像,python,image,tkinter,window,draw,Python,Image,Tkinter,Window,Draw,我正在尝试根据短语向窗口显示图像。如果短语中的字符与图片名称匹配,则应在窗口中显示。如果短语有多个字符,则与当前字符后的字符相关的图片应显示在当前字符图片的右侧。我怎样才能使一个新的并排图片二人组出现,这次显示的是与左边第二个字符和右边第三个字符相关的图片,依此类推?我尝试使用.after(),但我不确定该放在哪里 另外,当我运行下面的代码时,我会得到一个索引超出范围的错误,除非我使用break语句。但是我似乎不知道它是什么。也许使用after()方法可以解决这个问题 import tkinte

我正在尝试根据短语向窗口显示图像。如果短语中的字符与图片名称匹配,则应在窗口中显示。如果短语有多个字符,则与当前字符后的字符相关的图片应显示在当前字符图片的右侧。我怎样才能使一个新的并排图片二人组出现,这次显示的是与左边第二个字符和右边第三个字符相关的图片,依此类推?我尝试使用.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()
将tkinter作为tk导入
从PIL导入ImageTk、Image、ImageDraw、ImageFont
导入时间
def open_image():
全球i
全球形象
全球img
全球图像2
全球img2
如果我
我简化了代码以创建工作示例

after()
使用函数名,但不使用
()

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

开始时,我创建了不带图像的
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()
将tkinter作为tk导入
从PIL导入图像,ImageTk
#---功能---
def open_image():
全球i
全球形象
全球img
如果i
使用universal widget方法安排对函数的调用,该函数在指定延迟后更改图片。我应该将其放置在哪里?是否必须删除函数中的for循环?是的,您需要删除
for
循环。您可能需要在
按钮
菜单
小部件的
命令
回调函数中调用
after()
。GUI编程基于不同于您可能已经习惯的顺序过程式编程的范例,所有事情都必须在主用户事件处理循环的上下文中发生(
mainloop()
in
tkinter
)。请看问题的公认答案。请注意,基本上你想要做的是(非常慢的)动画。我已经编辑过了,你介意看一下吗?我遇到了与以前相同的问题-行中的字符串索引超出范围错误:if短语[I+1]!=无和短语[i+1]!=“”:此版本是使用图像打开新窗口还是使用同一窗口?它只使用一个窗口,并更改现有标签中的图像