Python PIL ImageTk.PhotoImage () выдает ошибку шины? - PullRequest
7 голосов
/ 05 июля 2010

Итак, я запускаю python 2.6 на MacBook Pro и пытаюсь написать код на python для отображения изображения из файла на этикетке в интерфейсе tkinter. Изображение называется image.png. Программа работает без ошибок, когда я использую этот код

i = Image.open("image.png")

но когда я делаю этот код (я добавляю одну строку):

i = Image.open("image.png")
photo = ImageTk.PhotoImage(i)

Программа вылетит и выдаст сообщение «Ошибка шины» в командной строке. Я даже не знаю, что это значит. Я думаю, что PIL установлен правильно, так как Image работает, но тот факт, что ImageTk не работает, меня озадачивает. Кто-нибудь может сказать мне, что может быть причиной этой ошибки шины?

EDIT: Ну, я сделал новую программу, чтобы проверить ошибку дальше. Вот точный скрипт, который я запустил:

import Image
import ImageTk

i = Image.open("image.png")
photo = ImageTk.PhotoImage(i)

Теперь вместо "Ошибка шины" это мой трассировщик.

Traceback (most recent call last):
  File "imageTest.py", line 5, in <module>
    photo = ImageTk.PhotoImage(i)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/PIL/ImageTk.py", line 113, in __init__
    self.__photo = apply(Tkinter.PhotoImage, (), kw)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", line 3285, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk/Tkinter.py", line 3226, in __init__
    raise RuntimeError, 'Too early to create image'
RuntimeError: Too early to create image
Exception AttributeError: "PhotoImage instance has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <ImageTk.PhotoImage instance at 0x3c7a30>> ignored

Ответы [ 3 ]

6 голосов
/ 06 июля 2010

Я не знаю об ошибке шины, но вам нужно создать окно Tk, прежде чем вы сможете вызвать PhotoImage. Этот скрипт работает для меня-

import Image 
import ImageTk
from Tkinter import Tk

window = Tk()
i = Image.open("image.png") 
photo = ImageTk.PhotoImage(i)
5 голосов
/ 31 января 2012

ImageTk.PhotoImage содержит ошибку сборки мусора (ref ref).Вы должны поместить ссылку на объект PhotoImage в глобальную переменную переменной экземпляра класса (например, self.myphoto = ImageTk.PhotoImage (i)).

См. Это предупреждение:

http://infohost.nmt.edu/tcc/help/pubs/pil/image-tk.html

2 голосов
/ 06 мая 2014

Даже если вам нужно вызвать окно Tk, вам также нужно установить каталог, чтобы он мог найти image.png.

import os
import Image 
import ImageTk
from Tkinter import Tk

os.chdir('C:/../../') # put file path for the image.

window = Tk()
i = Image.open("image.png") 
photo = ImageTk.PhotoImage(i)

window.mainloop()
...