2010-07-05 27 views
7

Donc, je cours python 2.6 sur un macbook pro et essaye d'écrire le code dans python pour montrer une image d'un dossier dans un label sur un tkinter gui. L'image s'appelle image.png. Le programme fonctionne sans erreurs lorsque j'utilise ce codePython PIL ImageTk.PhotoImage() me donne une erreur de bus?

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

mais quand je fais ce code (ajouter une ligne):

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

Le programme se bloque et dire « erreur de bus » dans la commande ligne. Je ne sais même pas ce que ça veut dire. Je pense que PIL est installé correctement, puisque Image fonctionne, mais le fait qu'ImageTk ne fonctionne pas me laisse perplexe. Quelqu'un peut-il me dire ce qui pourrait causer cette erreur de bus?

EDIT: Eh bien, j'ai fait un nouveau programme pour tester l'erreur plus loin. Voici le script exact que j'ai exécuté:

import Image 
import ImageTk 

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

Maintenant, au lieu d'obtenir "Erreur de bus", c'est ma traceback.

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

Veuillez modifier votre question pour afficher le message de trace complet et le message d'erreur exact que vous obtenez. –

Répondre

5

Je ne sais pas l'erreur de bus, mais vous devez créer une fenêtre Tk avant de pouvoir appeler PhotoImage. Ce script fonctionne pour moi-

import Image 
import ImageTk 
from Tkinter import Tk 

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

D'accord, quand je lance ce code, il fait comme si une interface graphique est sur le point d'ouvrir, puis une fenêtre surgit avec les mots, "Python se ferme de façon inattendue", et la fenêtre du terminal affiche "Erreur de bus" – Dylan

+0

: //bytes.com/topic/python/answers/532341-tkinter-bus-error-right-away Quelle version d'OSX utilisez-vous? Le code ci-dessus a fonctionné pour moi dans Python 2.6 et OS 10.6 –

+0

Je cours 10.6 et Python 2.6 également. Ce post a l'air d'être utile, alors je vais le regarder. Merci – Dylan

4

ImageTk.PhotoImage a une collection d'ordures (ref nombre) bug en elle. Vous devez placer une référence à l'objet PhotoImage dans une variable globale d'une variable d'instance de classe (par exemple, self.myphoto = ImageTk.PhotoImage (i)).

Voir cet avertissement:

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

+0

Essayez de faire ceci et la [réponse actuellement acceptée] (https://stackoverflow.com/ a/3183821/2573061). J'ai rencontré ce problème, et les deux ont été nécessaires pour le réparer. – C8H10N4O2

2

Même pensé que vous avez besoin d'appeler une fenêtre Tk, vous devez également définir le répertoire afin qu'il puisse trouver le 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()