Я пытаюсь отобразить изображение в Tkinter используя Pillow, но я получаю странную ошибку: «Процесс завершен с кодом выхода -1073741819 (0xC0000005)» и окном Tkinter никогда не появляется.Ошибка Imagetk.PhotoImage на Python 3.5 + Tk/Tcl 8.6
Вот код (упрощено до максимума):
from PIL import Image, ImageTk
from tkinter import Tk
t = Tk()
i = Image.open('data/pic.jpg') # small picture (29kb, 100x100px)
i_tk = ImageTk.PhotoImage(i) # The problem disappears when this line is commented out.
t.mainloop()
Я использую Python 3.5, Tcl/Tk 8.6, Подушка 3.0.0 на Windows 10 (все в 64-битной)
Это тот же скрипт (заменяющий tkinter by Tkinter) отлично работает на одном компьютере с Python 2.7.9, Tcl/Tk 8.5 и Pillow 2.9.0 (появляется окно Tk, а код выхода - 0, когда я закрываю окно Tk).
Любая помощь будет высоко оценена.
EDIT: По предложению пользователя5510752, я изменил i_tk = ImageTk.PhotoImage(i)
на i_tk = tkinter.PhotoImage(i)
. Теперь проблема переместилась с того места, где я делал PhotoImage, где я вставляю его в холст.
Вот новый код:
from PIL import Image
from tkinter import Tk, PhotoImage, Canvas
t = Tk()
c = Canvas(t, bg="blue")
c.grid(sticky="news")
c.i = Image.open("data/pic.jpg")
c.p = PhotoImage(c.i)
c.create_image(0, 0, image=c.p) # errors out here
t.mainloop()
Это дает эту ошибку TypeError: __str__ returned non-string (type JpegImageFile)
.
Traceback (most recent call last):
File "D:/Workspace/PythonProjects/Puzzle 3.5/main.py", line 29, in <module>
c.create_image(0, 0, image=c.p)
File "C:\Python 3.5\lib\tkinter\__init__.py", line 2328, in create_image
return self._create('image', args, kw)
File "C:\Python 3.5\lib\tkinter\__init__.py", line 2319, in _create
*(args + self._options(cnf, kw))))
TypeError: __str__ returned non-string (type JpegImageFile)
Я изучил другую подпись для этой функции для Python 3, но ничего не нашел. Эта линия работает только на Python 2.7 (с ImageTk.PhotoImage
). Что более странно, так это то, что если я попытаюсь загрузить c.i в холст вместо c.p, код не выйдет из строя, и я получу пустой холст.
[EDIT2]
Согласно предложению R4PH43L, я попробовал:
from tkinter import Tk, PhotoImage, Canvas
t = Tk()
c = Canvas(t, bg="blue")
c.grid(sticky="news")
c.p=PhotoImage(file="data/pic.jpg")
c.create_image(0, 0, image=c.p) # errors out here
t.mainloop()
Это дало новую ошибку:
Traceback (most recent call last):
File "D:/Workspace/PythonProjects/Puzzle 3.5/main.py", line 28, in <module>
c.p=PhotoImage(file="data/pic.jpg")
File "C:\Python 3.5\lib\tkinter\__init__.py", line 3393, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python 3.5\lib\tkinter\__init__.py", line 3349, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "data/pic.jpg"
Я пытался каждый раз с разными JPEGs но безрезультатно , На этот раз я также попытался с GIF, и он работал (но мне нужно открыть JPEG, так что ...). Стоит отметить, что libjpeg установлен на моей машине, и Pillow, похоже, не имеет никаких проблем с его использованием (кроме случаев, когда я передаю pic в ImageTk, мы возвращаемся к исходной ошибке).
PS: Если кому-то удалось показать файл jpg на холсте tkinter в python 3.5, просто разместите версию Tcl/Tk, libjpeg и Pillow, которую вы используете. Я подозреваю, что это может быть просто до двух модулей, которые несовместимы в моей текущей конфигурации Python 3.
Вы пропускаете ведущий слэш Image.open («/ данные/pic.jpg») –
Я пытался, но он не может найти изображение с слэш , – takeshi2010
Пожалуйста, сообщите нам полное сообщение об ошибке, в т.ч. стек вызовов – R4PH43L