Tkinter.PhotoImage不支持png图像

时间:2014-12-22 08:49:16

标签: python linux tkinter tk

我正在使用Tkinter编写GUI并希望在Tkiner.Label中显示png文件。 所以我有一些像这样的代码:

self.vcode.img = PhotoImage(data=open('test.png').read(), format='png')
self.vcode.config(image=self.vcode.img)

此代码在我的Linux计算机上正常运行。但是当我在我的Windows机器上运行它时,它失败了。我还在其他几台机器上测试过(包括windows和linux),它一直都失败了。

Traceback是:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
    return self.func(*args)
  File "C:\Documents and Settings\St\client\GUI.py", line 150, in showrbox
    SignupBox(self, self.server)
  File "C:\Documents and Settings\St\client\GUI.py", line 197, in __init__
    self.refresh_vcode()
  File "C:\Documents and Settings\St\client\GUI.py", line 203, in refresh_vcode
    self.vcode.img = PhotoImage(data=open('test.png').read(), format='png')
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 3323, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 3279, in __init__
   self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: image format "png" is not supported

如果我在源代码中删除format='png',则回溯将变为:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__
    return self.func(*args)
  File "C:\Documents and Settings\St\client\GUI.py", line 150, in showrbox
    SignupBox(self, self.server)
  File "C:\Documents and Settings\St\client\GUI.py", line 197, in __init__
    self.refresh_vcode()
  File "C:\Documents and Settings\St\client\GUI.py", line 203, in refresh_vcode
    self.vcode.img = PhotoImage(data=open('test.png').read())
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 3323, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 3279, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: couldn't recognize image data

那么,我该怎么做才能使它支持png文件?

7 个答案:

答案 0 :(得分:8)

PIL现在由Pillow http://pillow.readthedocs.io/en/3.2.x/

取代

溶液:

from Tkinter import *
import PIL.Image
import PIL.ImageTk

root = Toplevel()

im = PIL.Image.open("photo.png")
photo = PIL.ImageTk.PhotoImage(im)

label = Label(root, image=photo)
label.image = photo  # keep a reference!
label.pack()

root.mainloop()

答案 1 :(得分:7)

tkinter仅支持3种文件格式,即GIF,PGM和PPM。您将需要将文件转换为.GIF然后加载它们(更容易,但正如jonrsharpe所说,没有首先转换文件就没有任何工作)或者您可以将程序移植到Python 2.7并使用Python Imaging Library(PIL)及其tkinter扩展使用PNG图像。

您可能会觉得有用的链接:http://effbot.org/tkinterbook/photoimage.htm

答案 2 :(得分:3)

Tkinter 8.6支持png文件格式,而tkinter 8.5则不支持。如果你有升级python的选项,你可以使用png。 如果你必须使用旧版本的python,你应该使用Pillow(维护的pil fork),它也适用于python3。

如果您正在开始一个新项目不按照接受的答案中的建议使用python2或PIL ,则它们都是折旧技术。

答案 3 :(得分:0)

尝试使用PIL库而不是将图像转换为GIF,PGM或PPM(PhotoImage)只接受这3种格式。

import tkinter as tk
import PIL.Image
import PIL.ImageTk

base = tk.Tk()
base.title("Dialy Dose")

logoPath = r"C:\Users\saigopi\Downloads\logo.png"

ref = PIL.Image.open(logoPath)
photo = PIL.ImageTk.PhotoImage(im)

inputEdit = tk.Label(base,text="Enter Quote")
save = tk.Button(base,text="Save",background="green",command=save())
logo = tk.Label(base,image=photo,text="Logo bro lite")
quote = tk.Label(base,text="I am saying you are more than something")

inputEdit.pack()
save.pack()
logo.pack()
quote.pack()

base.mainloop()

答案 4 :(得分:0)

修正了官方python.org 64位(仅限)OS X安装程序.Tk版本8.6包含在内。警告:如果您使用自制软件,截至此帖子,brew install python3仅提供8.5,使用png需要8.6,因此您必须使用官方安装程序。要检查您使用的是哪个Tk:

$ python3 -c 'import tkinter; print(tkinter.TkVersion);'

如果报告为8.6,那么你很高兴。

答案 5 :(得分:0)

from tkinter import *
from tkinter import messagebox
import os
from PIL import Image, ImageTk


root = Tk()
root.geometry("1300x720")
root.title("KEDİLERİMİZ ve KÖPEKLERİMİZ")
class Ana:
    def __init__(self,name,roll):
        self.name = name
        self.roll = roll
resim = Label(root,width=77,height=43,bg="blue")
resim.place(x=730,y=10)
o = "1.PNG"
hu = o.find(".")
mu = o[hu:]
if mu == ".gif" or mu == ".png":
    img = PhotoImage(file = o)
else:
    photo = Image.open(o)
    img = ImageTk.PhotoImage(photo)
resim.configure(image=img,width=img.width(),height=img.height())
resim.image = img

答案 6 :(得分:0)

在 Windows 上,您必须使用这种特定格式:

Example = PhotoImage(file='photo.png')

如果您想将其调整为较小的尺寸:

Example = Example.subsample(2, 2)

Example = Example.subsample(3, 3)

总代码:

Example = PhotoImage(file='photo.png')
Example = Example.subsample(1, 1)

但未来警告,除非您将照片与脚本放在同一个文件中,否则您必须将文件位置与照片一起归档!