web-dev-qa-db-ja.com

Tkinter.PhotoImageはpng画像をサポートしていません

Tkinterを使用してGUIを作成していて、pngファイルをTkiner.Labelに表示したいと考えています。だから私はこのようないくつかのコードを持っています:

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

このコード私のLinuxマシンで正しく実行されます。しかし、Windowsマシンで実行すると、失敗します。他のいくつかのマシン(WindowsやLinuxを含む)でもテストしましたが、常に失敗しました。

トレースバックは次のとおりです。

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ファイルをサポートするにはどうすればよいですか?

4
zsrkmyn

tkinterは、GIF、PGM、およびPPMの3つのファイル形式のみをサポートします。ファイルを.GIFに変換してからロードする必要があります(はるかに簡単ですが、jonrsharpeが言ったように、最初にファイルを変換しないと何も機能しません)、またはプログラムをPython 2.7 Python Imaging Library(PIL)とそのtkinter拡張機能を使用してPNG画像を使用します。

役立つと思われるリンク: http://effbot.org/tkinterbook/photoimage.htm

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()
8
HCLivess

Tkinter 8.6はpngファイル形式をサポートしていますが、tkinter8.5はサポートしていません。オプションupgrade pythonがあり、pngを使用しても問題ないはずです。古いバージョンのpythonを使用する必要がある場合は、Pillow(maintained pil fork)これはpython3でも機能します。

新しいプロジェクトを開始する場合python2またはPILを使用しないでください受け入れられた回答で提案されているように、これらは両方とも減価償却されたテクノロジーです。

3
timeyyy

OSX用の公式python.org64ビット(のみ)インストーラーで修正されました。Tkバージョン8.6はそのまま含まれています。警告:自作を使用している場合、この投稿の時点でbrew install python3は8.5しか提供せず、pngを使用するには8.6が必要なので、代わりに公式インストーラーを使用する必要があります。使用しているTkを確認するには:

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

8.6と報告された場合は、問題ありません。

0
crajun
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
0
Saner Benli

画像をGIF、PGM、またはPPM(PhotoImage)に変換する代わりに、PILライブラリを試してください。これらの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()
0
Sai Gopi N