【问题标题】:Python 3.7, tkinter, jpg: couldn't recognize data in image filePython 3.7、tkinter、jpg:无法识别图像文件中的数据
【发布时间】:2019-05-05 17:56:59
【问题描述】:

我想在 python3 中寻求一些关于 tkinter 的帮助。 我似乎无法使用以下代码在标签中显示 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

我遇到了所有我能找到的类似问题,但他们似乎都回答了同样的问题:“从 PIL 导入 ImageTk,图像” 当我尝试这样做时(目前,我正在尝试使用枕头,顺便说一句),ImageTk 似乎不可用。

任何帮助将不胜感激。

【问题讨论】:

  • 使用pnggif
  • 这不是我需要的...目的是让用户选择用他/她的手机拍摄的图像,默认情况下是 jpeg 的。

标签: python-3.x tkinter


【解决方案1】:
  1. 你必须安装PIL:pip install pillow

    如果pip 没有成功安装pillow,您可能需要尝试pip3pip3.7 (使用bash 来查看您有哪些选项)

  2. 你可以用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)
    

【讨论】:

  • 好吧,我想我是盯着同一个问题太久了,导致我看不到眼前的解决方案。出于某种原因,现在导入 ImageTk 可以正常工作,并且现在显示图像(甚至 jpeg 的)。非常感谢你,查克 G。我欠你一两杯啤酒。:-)
【解决方案2】:

Chuck G 提供的解决方案奏效了。我不知道为什么我最初无法导入 ImageTk,但最终还是可以正常工作。

from PIL import ImageTk

【讨论】:

    【解决方案3】:

    这个错误可能是由于文件路径中的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()
    
    
    

    试试这个!!!!

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 2019-07-29
      • 1970-01-01
      • 2021-10-18
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多