Python 3.7,tkinter,jpg格式:无法识别图像文件中的数据

kzmpq1sx  于 2023-02-26  发布在  Python
关注(0)|答案(3)|浏览(223)

我想问一些关于tkinter的帮助,在python3中,我似乎不能使用下面的代码在标签中显示jpeg图像文件:

def changephoto(self):
    self.tmpimgpath = filedialog.askopenfilename(initialdir=os.getcwd())
    self.installimagepath.set(self.tmpimgpath)
    self.selectedpicture = PhotoImage(file=self.installimagepath.get())
    self.PictureLabel.configure(image=self.selectedpicture)

它可以很好地处理png图像,但当我试图加载一个jpg图像时,我所能得到的只是以下错误:

_tkinter.TclError: couldn't recognize data in image file

我查了所有我能找到的类似问题,但它们似乎都回答了同样的问题:“from PIL import ImageTk,Image”当我尝试这样做时(目前,我正在尝试使用pillow,顺便说一句),ImageTk似乎不可用。
任何帮助都将不胜感激。

46qrfjad

46qrfjad1#

1.您必须安装PILpip install pillow.
如果pip未成功安装pillow,您可能必须尝试pip3pip3.7(使用bash查看您有哪些选项)
1.您可以使用ImageTk打开图像:

import os
import tkinter as tk
from tkinter import filedialog
from PIL import ImageTk

def changephoto():
   root = tk.Tk()
   PictureLabel= tk.Label(root)
   PictureLabel.pack()
   tmpimgpath = filedialog.askopenfilename(initialdir=os.getcwd())
   selectedpicture= ImageTk.PhotoImage(file=tmpimgpath)
   PictureLabel.configure(image=selectedpicture)
but5z9lq

but5z9lq2#

Chuck G提供的解决方案起作用了。我不知道为什么我最初不能导入ImageTk,但最终还是起作用了。

from PIL import ImageTk
icomxhvb

icomxhvb3#

这个错误可能会发生,因为relative file pathnon-English字符在文件路径,所以我做了这个函数,它在Windows中工作得很好,并与任何类型的文件路径:

def loadrelimages(relativepath):
    from PIL import ImageTk, Image
    import os
    directory_path = os.path.dirname(__file__)
    file_path = os.path.join(directory_path, relativepath)
    img = ImageTk.PhotoImage(Image.open(file_path.replace('\\',"/")))  
    return img

例如,加载photo_2021-08-16_18-44-28.jpg,它与以下代码位于同一目录:

from tkinter import *
import os

def loadrelimages(relativepath):
    from PIL import ImageTk, Image
    import os
    directory_path = os.path.dirname(__file__)
    file_path = os.path.join(directory_path, relativepath)
    img = ImageTk.PhotoImage(Image.open(file_path.replace('\\',"/")))  
    return img
root = Tk()

canvas = Canvas(root, width=500, height=500)
canvas.pack()

loadedimage=loadrelimages('photo_2021-08-16_18-44-28.jpg')
canvas.create_image(250, 250, image=loadedimage)

root.mainloop()

试试这个!

相关问题