Image viewer tkinter does not display an image? (_tkinter.TclError: couldn't recognize data.....)

Image viewer tkinter does not display an image? (_tkinter.TclError: couldn't recognize data.....)

今天!我正在尝试使用 tkinter 创建图像查看器应用程序,我编写的代码似乎出现错误 _tkinter.TclError: couldn't recognize data in image file "system_drive/boat.jpg"。但除此之外,据我所知,我收到此错误不应该是因为文件 boat.jpg 存在于文件夹 system_drive 中,而且我也没有犯任何语法错误,谢谢帮助!

代码:

from tkinter import *
import os
tk = Tk()

image_list = []

for file in os.listdir(os.getcwd()):
    if file.endswith(".png") or file.endswith(".jpg"):
        image_list.append(PhotoImage(file))

file_name = Entry(tk, width=20,font=("Helvetica", 20))
canvas = Canvas(tk, width=500, height=500)

canvas.pack()

def click_show_img(x):
    global file_name
    global image_list
    print("opening system_drive/{0}".format(file_name.get()))
    img = PhotoImage(file="system_drive/{0}".format(file_name.get()))
    canvas.create_image(60,60, anchor=NW, image=img)
    

tk.bind("<Return>", click_show_img)
file_name.pack()


tk.mainloop()

截图:

window 的样子:

应该是这样的:

Tkinter 不支持 jpeg 作为图像格式。如果您想显示 .jpg 文件,您需要使用 Pillow 或其他一些库来打开它。

来自tk的官方文档:

At present, only PNG, GIF and PPM/PGM formats are supported

这就是 tkinter 说它无法识别数据的原因。它与路径无关,与文件中数据的格式有关。 ) 或其他一些库打开它。

来自tk的官方文档:

At present, only PNG, GIF and PPM/PGM formats are supported

这就是 tkinter 说它无法识别数据的原因。与路径无关,与文件中数据的格式有关。

你还有一个问题。如果您不保存对图像的引用,python 的垃圾收集器将在函数 returns 时删除图像数据。您似乎已经有了一个包含图像的全局数组,所以我不明白您为什么要创建新图像。

img = PhotoImage(file="system_drive/{0}".format(file_name.get()))
image_list.append(img)

有关详细信息,请参阅 Why does Tkinter image not show up if created in a function?

代码开头的第三个问题是,您必须将文件名作为 file 属性的值而不是位置参数传递给 PhotoImage。第一个位置参数被视为名称,而不是路径。

image_list.append(PhotoImage(file=file))

您需要 Pillow 库才能打开图像并在 tkinter 上显示它 window。

from PIL import Image, ImageTk

将您的 click_show_img 函数更改为:

def click_show_img(x):
global file_name
global image_list
print("opening system_drive/{0}".format(file_name.get()))

img = Image.open("opening system_drive/{0}".format(file_name.get()))
img = ImageTk.PhotoImage(img)

canvas.create_image(60, 60, anchor=NW, image=img)

我已经设法解决了我的代码的问题; 我制作了一个新的标签实例,我只是像这样更新该标签实例的图像:

from tkinter import *
import os
from PIL import Image, ImageTk
tk = Tk()

image_list = []
image_holder = Label()

for file in os.listdir(os.getcwd()):
    if file.endswith(".png"):
        image_holder.image = PhotoImage(name)
        img = PhotoImage(file="system_drive/{0}".format(file_name.get()))
        image_list.append(img)
        
image_holder.place(x=-10,y=-10)

file_name = Entry(tk, width=20,font=("Helvetica", 20))
canvas = Canvas(tk, width=500, height=500)

canvas.pack()

my_label = Label(tk,bg="white")
my_label.place(x=-10,y=-20)

def click_show_img(x):
    global file_name
    global image_list
    print("opening system_drive/{0}".format(file_name.get()))
    link = "system_drive/{0}".format(file_name.get())
    my_img = ImageTk.PhotoImage(Image.open(link).resize((250,250)))
    my_label.configure(image=my_img)
    my_label.image = my_img
    my_label.place(relx=0.5,rely=0.3,anchor=CENTER)
        
tk.bind("<Return>", click_show_img)
file_name.pack()

tk.mainloop()