Python PIL ImageTk.PhotoImage()给我一个总线错误?

时间:2010-07-05 04:32:49

标签: python image python-imaging-library bus

所以我在macbook pro上运行python 2.6并尝试在python中编写代码,以显示tkinter gui上标签中的文件的图像。该图像称为image.png。使用此代码时,程序运行时没有错误

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

但是当我执行此代码时(我添加一行):

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

程序将崩溃并在命令行中说“总线错误”。我甚至都不知道这意味着什么。我认为PIL安装正确,因为Image工作,但ImageTk不起作用的事实让我困惑。任何人都可以告诉我可能导致此总线错误的原因吗?

编辑: 好吧,我制作了一个新程序来进一步测试错误。这是我运行的确切脚本:

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 个答案:

答案 0 :(得分:6)

我不知道总线错误,但您需要先创建一个Tk窗口才能调用PhotoImage。这个脚本适合我 -

import Image 
import ImageTk
from Tkinter import Tk

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

答案 1 :(得分:5)

ImageTk.PhotoImage中有一个垃圾收集(引用计数)错误。您必须在类实例变量的全局变量中放置对PhotoImage对象的引用(例如,self.myphoto = ImageTk.PhotoImage(i))。

请参阅此警告:

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

答案 2 :(得分: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()