2010-07-05 4 views
7

Also ich Python 2.6 auf einem Macbook Pro laufen und versuchen, den Code in Python zu schreiben, um ein Bild aus einer Datei in einem Etikett auf einem Tkinter GUI anzuzeigen. Das Bild heißt image.png. Das Programm läuft ohne Fehler, wenn ich diesen Code verwendenPython PIL ImageTk.PhotoImage() gibt mir einen Busfehler?

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

aber wenn ich diesen Code zu tun (ich hinzufügen, eine Zeile):

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

Das Programm stürzt ab und „Bus-Fehler“ in dem Befehl sagen Linie. Ich weiß nicht einmal, was das bedeutet. Ich würde denken, dass PIL korrekt installiert ist, da Image funktioniert, aber die Tatsache, dass ImageTk nicht funktioniert, verwirrt mich. Kann mir jemand sagen, was diesen Busfehler verursachen könnte?

EDIT: Nun habe ich ein neues Programm gemacht, um den Fehler weiter zu testen. Hier ist das genaue Skript, das ich ausgeführt habe:

import Image 
import ImageTk 

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

Jetzt anstelle von "Bus Fehler", das ist meine 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

Bitte bearbeiten Sie Ihre Frage, um die vollständige Rückverfolgung und genaue Fehlermeldung anzuzeigen, die Sie erhalten. –

Antwort

5

Ich weiß nicht, über die Bus-Fehler, aber man braucht ein Tk-Fenster erstellen, bevor Sie Photobild aufrufen können. Dieses Skript arbeitet für me-

import Image 
import ImageTk 
from Tkinter import Tk 

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

Okay, wenn ich diesen Code ausführen, macht es wie eine GUI zu öffnen ist, dann erscheint ein Popup mit den Worten, "Python unerwartet beendet", und das Terminal-Fenster druckt "Bus error" – Dylan

+0

Dieser Beitrag kann relevant-http sein : //bytes.com/topic/python/answers/532341-tkinter-bus-error-right-away Welche Version von OSX laufen Sie? Der Code oben arbeitete für mich in Python 2.6 und OS 10.6 –

+0

Ich 10.6 und Python 2.6 auch laufen. Dieser Beitrag sieht jedoch so aus, als wäre er nützlich, also werde ich ihn mir ansehen. Danke – Dylan

4

ImageTk.PhotoImage hat eine Garbage Collection (ref count) Fehler drin. Sie müssen einen Verweis auf das PhotoImage-Objekt in einer globalen Variablen einer Klasseninstanzvariablen platzieren (z. B. self.myphoto = ImageTk.PhotoImage (i)).

Sehen Sie diese Warnung:

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

+0

Versuchen Sie beides und die [derzeit akzeptierte Antwort] (https://stackoverflow.com/) a/3183821/2573061). Ich hatte dieses Problem und beide mussten es beheben. – C8H10N4O2

2

Auch haben Sie hier auch das Verzeichnis festlegen müssen eine Tk-Fenster müssen anrufen, damit es die image.png finden.

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()