ImageTk.Сбой PhotoImage

#python #tkinter #python-imaging-library

#python #tkinter #python-imaging-library

Вопрос:

Я пытался изменить размер изображений с помощью PIL, а затем отобразить их с помощью Tkinter, но в программе произошел сбой, и я выделил проблему во второй строке ниже:

 image = Image.open("0.gif")
photo = ImageTk.PhotoImage(image)
  

И это мой импорт:

 from Tkinter import * 
from PIL import Image, ImageTk 
  

Я где-то читал, что Tk должен быть инициализирован, и я делаю это в программе до того, как он достигнет этих строк в программе. Итак, я не знаю, что это такое.

Я запускаю интерпретатор OSX и python 2.7 в eclipse (используя PyDev).

Обновить:

Сообщение об ошибке в eclipse гласит:

 STACK: Stack after current is in use
  

Комментарии:

1. Вы должны опубликовать сообщение об ошибке.

2. Хорошая идея, теперь она там!

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

4. Есть ли шанс, что вы действительно могли бы опубликовать весь исходный код (или, что еще лучше, минимальное воспроизведение), чтобы нам было легче диагностировать, чего вам не хватает?

5. @VictorMota вы когда-нибудь решали эту проблему? Не могли бы вы ответить на свой собственный вопрос и принять его, если у вас есть.

Ответ №1:

Я видел эту ошибку перед использованием tkinter. Я думаю, что это как-то связано с более старой версией tkinter. Я обновил свою версию python и версию tkinter, и она исчезла. Возникает ли эта ошибка при запуске вашего кода на другой ОС / компьютере / платформе / версии Python? Какую версию tkinter вы используете? При поиске в Google были обнаружены эти две страницы, которые описывают одну и ту же ошибку при использовании tkinter…

http://osdir.com/ml/python.leo.general/2008-03/msg00060.html
http://fornax.phys.unm.edu/lwa/trac/ticket/3

Я не могу видеть весь ваш код, но держу пари, что в вашем коде не обязательно что-то не так. Следующий код сработал для меня…

 from Tkinter import * 
from PIL import Image, ImageTk 

# resize image with PIL
im = Image.open('path to gif')
resized_im = im.resize((400,400,),Image.ANTIALIAS)

# display image in tkinter window
window = Tk()
tk_im = ImageTk.PhotoImage(resized_im)
window.geometry('%dx%d' % (resized_im.size[0],resized_im.size[1]))
label_image = Label(window, image=tk_im)
label_image.place(x=0,y=0,width=resized_im.size[0],height=resized_im.size[1])
window.mainloop()
  

Использование….
64-разрядная версия ubuntu 10.04

python 2.6.5

python-imaging-tk 1.1.7

python-tk 2.6.5 (который использует версию 8.5.0 tkinter)
библиотека изображений python (PIL) 1.1.7

eclipse 3.7.1

pydev 2.5.0.2012050419

Удачи!

Ответ №2:

Я использовал как Tk, так и PIL и изменял размеры изображений для текущего проекта, и следующий код отлично работает для меня.

 #Imports
from Tkinter import * 
from PIL import Image, ImageTk 

#Create Tk instance
root = Tk()

#Open image and resize
image = Image.open("path/to/image/file").resize((400,400), Image.ANTIALIAS)
photo = ImageTk.PhotoImage(image)
  

После этого мне проще всего отображать изображения в виде меток в tkinter вот так.

 image_label = Label(root, width = 400, height = 400, image = photo bd = 0)
  

(Мне нравится bd = 0 , так как в противном случае я получаю тонкую белую рамку вокруг изображения.)
Надеюсь, это помогло вам. Удачи!
Ed

Ответ №3:

Итак, это древний вопрос, но на случай, если кто-то наткнется на это (как я только что сделал), сообщение об ошибке из Tcl (tclExecute.c). Я понятия не имею, что его запускает, но стоит попробовать создать Tk экземпляр перед вызовом PhotoImage :

 root = Tk()
image = Image.open("0.gif")
photo = ImageTk.PhotoImage(image)
  

Комментарии:

1. Если вы понятия не имеете, что вызывает ошибку, не пытайтесь найти решение. Кроме того, в исходном вопросе говорится, что tk инициализируется, поэтому вы рекомендуете им сделать то, что они уже делают («Я где-то читал, что Tk должен быть инициализирован, и я делаю это в программе, прежде чем она достигнет этих строк «)

2. Я не вижу, чтобы кто-нибудь еще упоминал, откуда приходит сообщение об ошибке, но если пометка этого как бесполезного заставляет вас чувствовать себя лучше, будьте моим гостем.