如何使用python Tkinter迭代图像?

如何使用python Tkinter迭代图像?,python,tkinter,Python,Tkinter,如何使用python Tkinter迭代图像 import tkinter as tk from PIL import ImageTk, Image win = tk.Tk() win.geometry('800x500') # set window size win.resizable(0, 0) # fix window images = ['01.jpg', '02.jpg', '03.jpg'] def next_img(): # show next image for

如何使用python Tkinter迭代图像

import tkinter as tk
from PIL import ImageTk, Image

win = tk.Tk()
win.geometry('800x500')  # set window size
win.resizable(0, 0)  # fix window

images = ['01.jpg', '02.jpg', '03.jpg']

def next_img():
   # show next image

for img in images:
    img = Image.open(img)
    img = ImageTk.PhotoImage(img)
    panel = tk.Label(win, image=img)
    panel.pack()
    btn = tk.Button(text='Next image', command=next_img)
    btn.pack()
win.mainloop()

但是我的面板没有显示任何图像。我希望面板等待我,我点击按钮显示下一张图片。如何解决此问题。

不幸的是,Tkinter有点让人困惑,当您将图像放置在标签或按钮中时,您需要将其添加到下面的行中
panel.photo=img

我不太清楚为什么会这样,但似乎有两个值用于显示图像。

不幸的是,Tkinter有点混乱,当将图像放置在标签或按钮中时,您需要添加到下面的行中
panel.photo=img

我不太清楚为什么会这样,但似乎有两个值将图像显示出来。

代码不显示任何图像的原因有点复杂。有两个因素共同作用:

  • 因为您在循环中创建标签(用于显示图像的标签),所以最终会创建3个标签和3个按钮-每个图像一个。所有这些都排列在彼此下方,因此根据图像的大小,其中一些可能位于窗口的底边下方。如果使用小图像,您将在窗口中看到三个“下一个图像”按钮
  • 如果在python代码中不保留对Tkinter图像的引用,则Tkinter图像将被垃圾收集。由于循环会在每次迭代中覆盖
    img
    变量的值,因此除最后一个图像外,所有图像都会被垃圾收集,不会显示

  • 要修复代码,请首先删除该循环。您不需要3个标签和3个按钮,也不需要在程序启动时立即加载所有3个图像

    加载和显示图像的代码应移到
    next\u img
    功能中。您可以使用命令
    panel['image']=img
    更新标签的图像

    为了循环浏览图像列表,最简单的方法是使用迭代器。您可以通过调用
    images=iter(images)
    将图像列表转换为一个。然后,您可以在需要时使用该函数从迭代器获取下一个图像

    import tkinter as tk
    from PIL import ImageTk, Image
    
    win = tk.Tk()
    win.geometry('800x500')  # set window size
    win.resizable(0, 0)  # fix window
    
    panel = tk.Label(win)
    panel.pack()
    
    images = ['01.jpg', '02.jpg', '03.jpg']
    images = iter(images)  # make an iterator
    
    def next_img():
        try:
            img = next(images)  # get the next image from the iterator
        except StopIteration:
            return  # if there are no more images, do nothing
    
        # load the image and display it
        img = Image.open(img)
        img = ImageTk.PhotoImage(img)
        panel.img = img  # keep a reference so it's not garbage collected
        panel['image'] = img
    
    btn = tk.Button(text='Next image', command=next_img)
    btn.pack()
    
    # show the first image
    next_img()
    
    win.mainloop()
    
    此代码将在图像中循环一次,当到达最后一个图像时,按下“下一个图像”按钮将无效。如果要环绕第一个图像,可以创建一个无限循环迭代器:

    images = itertools.cycle(images)
    

    代码不显示任何图像的原因有点复杂。有两个因素共同作用:

  • 因为您在循环中创建标签(用于显示图像的标签),所以最终会创建3个标签和3个按钮-每个图像一个。所有这些都排列在彼此下方,因此根据图像的大小,其中一些可能位于窗口的底边下方。如果使用小图像,您将在窗口中看到三个“下一个图像”按钮
  • 如果在python代码中不保留对Tkinter图像的引用,则Tkinter图像将被垃圾收集。由于循环会在每次迭代中覆盖
    img
    变量的值,因此除最后一个图像外,所有图像都会被垃圾收集,不会显示

  • 要修复代码,请首先删除该循环。您不需要3个标签和3个按钮,也不需要在程序启动时立即加载所有3个图像

    加载和显示图像的代码应移到
    next\u img
    功能中。您可以使用命令
    panel['image']=img
    更新标签的图像

    为了循环浏览图像列表,最简单的方法是使用迭代器。您可以通过调用
    images=iter(images)
    将图像列表转换为一个。然后,您可以在需要时使用该函数从迭代器获取下一个图像

    import tkinter as tk
    from PIL import ImageTk, Image
    
    win = tk.Tk()
    win.geometry('800x500')  # set window size
    win.resizable(0, 0)  # fix window
    
    panel = tk.Label(win)
    panel.pack()
    
    images = ['01.jpg', '02.jpg', '03.jpg']
    images = iter(images)  # make an iterator
    
    def next_img():
        try:
            img = next(images)  # get the next image from the iterator
        except StopIteration:
            return  # if there are no more images, do nothing
    
        # load the image and display it
        img = Image.open(img)
        img = ImageTk.PhotoImage(img)
        panel.img = img  # keep a reference so it's not garbage collected
        panel['image'] = img
    
    btn = tk.Button(text='Next image', command=next_img)
    btn.pack()
    
    # show the first image
    next_img()
    
    win.mainloop()
    
    此代码将在图像中循环一次,当到达最后一个图像时,按下“下一个图像”按钮将无效。如果要环绕第一个图像,可以创建一个无限循环迭代器:

    images = itertools.cycle(images)
    

    show next image
    不是有效的Python代码。
    show next image
    不是有效的Python代码。