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()
今天!我正在尝试使用 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()