使用循环更新窗口中的图像

时间:2018-11-06 20:07:33

标签: python tkinter

from PIL import Image, ImageTk
import numpy as np
import tkinter as tk
import time


def put_pixel(row, col):
    pixels[row, col] = [255, 255, 255]


width = 20
height = 10


pixels = np.full((height, width, 3), 0, dtype=np.uint8)


root = tk.Tk()
root.geometry("300x300")
root.configure(background='grey')

img = ImageTk.PhotoImage(Image.open("maze.png"))

panel = tk.Label(root, image=img)
panel.pack(side = "top")

b = tk.Button(root, text="Sure!")
b.pack(side="bottom", fill="both")

for i in range(1, width-2, 2):
    put_pixel(5, i)
    time.sleep(2)

    img = Image.fromarray(pixels, 'RGB')
    panel.configure(image=img)
    panel.image = img

root.mainloop()

该脚本仅在黑色图像上添加白色像素。但是我希望它动画化,逐步看到每个像素的增加。因此,我尝试在添加每个像素后更新标签中的图像。但是我出错了

  

_tkinter.TclError:图像“”不存在

如果我不使用循环,而只是将图像放入标签中,则效果很好。我该如何解决?

1 个答案:

答案 0 :(得分:0)

您需要将PIL.Image转换为tkinter.PhotoImage:

img = Image.fromarray(pixels, 'RGB')
tkimg = ImageTk.PhotoImage(img)
panel.configure(image=tkimg)
panel.image = img

tkinter.Label将仅接受此类型,而不接受PIL图像。