次のようなコードでtkinterのPhotoImageにpngファイルを指定すると、couldn't recognize data in image file "./isono.png"というエラーが出ました。
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image
from PIL import ImageTk
im = tk.PhotoImage(file="./isono.png")
$ python3 pic.py
Traceback (most recent call last):
File "pic.py", line 225, in module
main()
File "pic.py", line 49, in main
tab2_main(tab2)
File "pic.py", line 116, in tab2_main
im = tk.PhotoImage(file="./isono.png")
File "/usr/lib64/python3.6/tkinter/__init__.py", line 3545, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "/usr/lib64/python3.6/tkinter/__init__.py", line 3501, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "./isono.png"
PhotoImageへのファイルの指定方法を変更すると、エラーが出るという問題は解決しないものの、エラーの内容は変わります。
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image
from PIL import ImageTk
im = tk.PhotoImage(Image.open"./isono.png")
$ python3 pic.py
Traceback (most recent call last):
File "pic.py", line 225, in module
main()
File "pic.py", line 49, in main
tab2_main(tab2)
File "pic.py", line 118, in tab2_main
canvas.create_image(0, 0, image=im, anchor=tk.NW)
File "/usr/lib64/python3.6/tkinter/__init__.py", line 2489, in create_image
return self._create('image', args, kw)
File "/usr/lib64/python3.6/tkinter/__init__.py", line 2480, in _create
*(args + self._options(cnf, kw))))
TypeError: __str__ returned non-string (type PngImageFile)
原因
PhotoImageのライブラリが間違っていました。tkinterのPhotoImageではなく、PIL ImageTkのPhotoImageを使う必要がありました。
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image
from PIL import ImageTk
im = ImageTk.PhotoImage(file="./isono.png")