2013-08-22 32 views
7

Non riesco a far funzionare la mia immagine PIL su tela. Codice:Come aprire l'immagine PIL in Tkinter su tela

from Tkinter import* 
import Image, ImageTk 
root = Tk() 
root.geometry('1000x1000') 
canvas = Canvas(root,width=999,height=999) 
canvas.pack() 
image = ImageTk.PhotoImage("ball.gif") 
imagesprite = canvas.create_image(400,400,image=image) 
root.mainloop() 

Errore:

Traceback (most recent call last): 
    File "C:/Users/Mark Malkin/Desktop/3d Graphics Testing/afdds.py", line 7, in <module> 
    image = ImageTk.PhotoImage("ball.gif") 
    File "C:\Python27\lib\site-packages\PIL\ImageTk.py", line 109, in __init__ 
    mode = Image.getmodebase(mode) 
    File "C:\Python27\lib\site-packages\PIL\Image.py", line 245, in getmodebase 
    return ImageMode.getmode(mode).basemode 
    File "C:\Python27\lib\site-packages\PIL\ImageMode.py", line 50, in getmode 
    return _modes[mode] 
KeyError: 'ball.gif' 

ho bisogno di usare le immagini non pil PhotoImages perché voglio ridimensionare le mie immagini. Per favore non suggerire di passare a Pygame perché voglio usare Tkinter.

+1

Sono confuso - dici di non voler usare 'PhotoImage's, ma il tuo codice usa un' PhotoImage'. Vuoi dire che vuoi usare 'ImageTk.PhotoImage' piuttosto che' Tkinter.PhotoImage'? – Brionius

+1

Hai provato a leggere i documenti per 'PhotoImage'? Prende un oggetto immagine, o una modalità e una dimensione. Non lo passi neanche; stai passando un nome di file. (Il 'KeyError' su' return _modes [mode] 'rende abbastanza ovvio che sta cercando di trattare il nomefile come una modalità ... ma non importa quale abbia provato, fallirebbe in entrambi i modi.) – abarnert

risposta

8

Provare a creare prima un'immagine PIL, quindi utilizzarla per creare PhotoImage.

from Tkinter import * 
import Image, ImageTk 
root = Tk() 
root.geometry('1000x1000') 
canvas = Canvas(root,width=999,height=999) 
canvas.pack() 
pilImage = Image.open("ball.gif") 
image = ImageTk.PhotoImage(pilImage) 
imagesprite = canvas.create_image(400,400,image=image) 
root.mainloop() 
+0

ImageTk.PhotoImage è quello che volevo usare, perché voglio essere in grado di ridimensionare. – user164814

+0

raise ImportError ("Il modulo _imaging C non è installato") ImportError: il modulo _imaging C non è installato – user164814

+0

@ user164814 Ah, sei in un momento divertente allora. Ti manca un binario PIL: questo è un problema con l'installazione di PIL, non con il codice. Vedi [questo articolo] (http://effbot.org/zone/pil-imaging-not-installed.htm). Se hai usato MacPorts per installare PIL, prova a installare da solo una build di sistema. In bocca al lupo. – Brionius

2

È possibile importare più formati di immagine e ridimensionarli con questo codice. "basewidth" imposta la larghezza della tua immagine.

from Tkinter import * 
import PIL 
from PIL import ImageTk, Image 

root=Tk() 
image = Image.open("/path/to/your/image.jpg") 
canvas=Canvas(root, height=200, width=200) 
basewidth = 150 
wpercent = (basewidth/float(image.size[0])) 
hsize = int((float(image.size[1]) * float(wpercent))) 
image = image.resize((basewidth, hsize), PIL.Image.ANTIALIAS) 
photo = ImageTk.PhotoImage(image) 
item4 = canvas.create_image(100, 80, image=photo) 

canvas.pack(side = TOP, expand=True, fill=BOTH) 
root.mainloop() 
0

(. Una vecchia questione, ma le risposte finora sono solo a metà completo)

Leggere la documentazione:

class PIL.ImageTk.PhotoImage(image=None, size=None, **kw) 
  • image - O un'immagine PIL, o di un stringa di modalità. [...]
  • file - Un nome file per caricare l'immagine da (utilizzando Image.open(file)).

Quindi nel tuo esempio, utilizzare

image = ImageTk.PhotoImage(file="ball.gif") 

o esplicitamente

image = ImageTk.PhotoImage(Image("ball.gif")) 

(E ricordate - come avete fatto in modo corretto: Tenere un riferimento all'oggetto immagine nel vostro programma Python, altrimenti è spazzatura-raccolta prima di vederlo.)

Problemi correlati