2015-10-31 2 views
0

Я пытаюсь отобразить изображение в 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.

+0

Вы пропускаете ведущий слэш Image.open («/ данные/pic.jpg») –

+0

Я пытался, но он не может найти изображение с слэш , – takeshi2010

+0

Пожалуйста, сообщите нам полное сообщение об ошибке, в т.ч. стек вызовов – R4PH43L

ответ

0

Ваш исходный код должен работать безупречно, но, кажется, есть что-то неправильно с подушкой или Tk.

В любом случае вы не можете загрузить jpg без ImageTk.PhotoImage(), поэтому нет способа обработать его с помощью подушки и Tk, пока кто-то не поймет причину сбоя.

И у меня такая же проблема с подушкой 3.0 колеса, но это не было очень важно для меня ...

JFYI CallStack: https://gist.github.com/DoumanAsh/6dba8411a109fbc68197

P.S. У меня такая же настройка, как и у вас. И я подозреваю, что питон 3.5 на Win платформе следует использовать только Tk 8.6, потому что окна пакет был обновлен с Tcl 8.6.3 и что введена поддержка TCL для Win10

UPD:

Вопрос фиксируется https://github.com/python-pillow/Pillow/pull/1553

Я полагаю, 3.0.1 версия будет содержать это исправить

+0

Извините, но я пока не могу подтвердить свой ответ, но я мог бы, если бы мог. Спасибо за конструктивный ответ :-). Теперь я знаю, что это не связано с моей установкой. Я закончил возвращаться к Python 2.7.9 для моего проекта и, кроме того, для некоторых отличных трюков Python 3, которые я не мог использовать, все работало нормально. Мне жаль, что они не смогли это исправить. – takeshi2010

+0

(я принял его, хотя, как я пока не вижу лучшего ответа) – takeshi2010

+0

Ваш вопрос, хотя напомнил мне об этой проблеме и поднял ее на подушку. Возможно, у них будут некоторые предложения по этому поводу: https://github.com/python-pillow/Pillow/issues/1549 – Douman

0

Большинство функций TkInter изменились питона 3 переменной, i_tk, должно быть так:

i_tk = tkinter.PhotoImage(i) 
+0

Спасибо за предложение. Я обновил вопрос, поскольку проблема, похоже, была продвинута дальше. – takeshi2010

0

Посмотрите на эту question.

Попробуйте создать свое изображение как c.p=tkinter.PhotoImage(file="data/pic.jpg").

Как вы можете видеть в вашей stacktrace, ошибка возникает при отображении аргументов и аргументов ключевых слов (*args, **kwargs).поскольку вы просто передаете изображение без ключевого слова, он пытается проанализировать ваш Image.open([...]) в качестве позиционного аргумента. Это не удается, поскольку позиционные аргументы читаются здесь как строки. Об этом говорит ваш стек.

Один взгляд на documentation:

The PhotoImage class can read GIF and PGM/PPM images from files

+0

Спасибо за ссылку и предложение. Я внимательно их прочитал и сделал несколько тестов на их основе. Это не сработало. Я отредактировал вопрос с новой трассировкой стека. Спасибо за вашу помощь. – takeshi2010

+0

Подождите секунду, я установлю py3 и протестирую его. вы уже проверили файл jpeg, не так ли? – R4PH43L

+0

Спасибо. Я проверил файл jpg и протестировал несколько других из разных источников. Ничего не работало для jpg-файлов. GIF работал. – takeshi2010

Смежные вопросы