首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图像查看器不显示图像?(_tkinter.TclError:无法识别数据……)

图像查看器不显示图像?(_tkinter.TclError:无法识别数据……)
EN

Stack Overflow用户
提问于 2022-04-24 15:43:56
回答 3查看 97关注 0票数 0

今天,我尝试用tkinter创建一个图像查看程序,我编写的代码似乎得到了错误_tkinter.TclError: couldn't recognize data in image file "system_drive/boat.jpg"。但除此之外,据我所知,我没有得到这个错误的原因,文件boat.jpg存在于system_drive文件夹中,我也没有犯任何语法错误,谢谢您的帮助!

代码:

代码语言:javascript
运行
复制
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()

截图:

窗口的外观:

它应该是什么样的:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-24 21:53:04

我已经设法解决了代码的问题;我创建了一个新的label实例,我只需更新标签实例的图像,如下所示:

代码语言:javascript
运行
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2022-04-24 16:10:15

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

来自tk的正式文件:

目前,只支持PNG、GIF和PPM/PGM格式。

这就是为什么tkinter不承认这些数据的原因。它与路径无关,与文件中数据的格式有关。)或者其他图书馆来打开它。

来自tk的正式文件:

目前,只支持PNG、GIF和PPM/PGM格式。

这就是为什么tkinter不承认这些数据的原因。它与路径无关,与文件中数据的格式有关。

你还有另外一个问题。如果不保存对图像的引用,python的垃圾收集器将在函数返回时删除图像数据。看起来你已经有了一个全局数组,它有图像,所以我不明白你为什么要创建新的图像。

代码语言:javascript
运行
复制
img = PhotoImage(file="system_drive/{0}".format(file_name.get()))
image_list.append(img)

有关详细信息,请参阅为什么如果在函数中创建Tkinter图像就不会显示出来?

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

代码语言:javascript
运行
复制
image_list.append(PhotoImage(file=file))
票数 1
EN

Stack Overflow用户

发布于 2022-04-24 16:41:02

您需要枕头库来打开图像,并显示在tkinter窗口。

代码语言:javascript
运行
复制
from PIL import Image, ImageTk

将click_show_img函数更改为:

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71989978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档