【问题标题】:How to use python Tkinter to iterate images?如何使用 python Tkinter 迭代图像?
【发布时间】:2018-09-29 17:07:02
【问题描述】:

如何使用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()

但我的面板没有显示任何图像。我希望面板等我,然后单击按钮显示下一个图像。如何解决。

【问题讨论】:

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

标签: python tkinter


【解决方案1】:

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

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

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

加载和显示图像的代码应该移到next_img 函数中。您可以使用命令panel['image'] = img 更新标签的图像。

为了在图像列表中循环,使用迭代器是最简单的。您可以通过调用images = iter(images) 将您的图像列表转换为iterator。然后你可以在需要的时候使用next函数从迭代器中获取下一张图片。

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()

此代码将遍历图像一次,当到达最后一张图像时,按“下一张图像”按钮将无效。如果你想环绕到第一张图片,你可以itertools.cycle 来创建一个无限循环的迭代器:

images = itertools.cycle(images)

【讨论】:

    【解决方案2】:

    不幸的是,Tkinter 有点混乱,当将图像放在标签或按钮中时,您需要在下面的行中添加 panel.photo = img 我不确定为什么会这样,但似乎有 2 个值可以将图像显示出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2012-08-30
      • 2019-09-05
      • 2015-04-25
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多