2010-07-05 1 views
7

Итак, я запускаю python 2.6 на macbook pro и пытаюсь написать код на python, чтобы отобразить изображение из файла в метке на tkinter gui. Изображение называется image.png. Программа работает без ошибок, когда я использую этот кодPython PIL ImageTk.PhotoImage() дает мне ошибку шины?

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 
+0

Пожалуйста, отредактируйте ваш вопрос, чтобы показать полную информацию о трассировке и точной ошибке. –

ответ

5

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

import Image 
import ImageTk 
from Tkinter import Tk 

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

Хорошо, когда я запускаю этот код, он делает так, что графический интерфейс вот-вот откроется, а затем всплывающее окно со словами «Python quit неожиданно», а окно терминала печатает «Ошибка шины» – Dylan

+0

Это сообщение может быть релевантным-http : //bytes.com/topic/python/answers/532341-tkinter-bus-error-right-away Какая версия OSX вы используете? Код выше работал для меня в Python 2.6 и OS 10.6 –

+0

Я запускаю 10.6 и Python 2.6. Это сообщение похоже, что это может быть полезно, поэтому я буду смотреть на него. Спасибо – Dylan

4

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

это предупреждение:

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

+0

Попробуйте сделать это и [принятый в настоящее время ответ] (https://stackoverflow.com/ а/3183821/2573061). Я испытал эту проблему, и оба должны были ее исправить. – C8H10N4O2

2

Даже думал, что вам нужно вызвать окно 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()