2013-08-22 12 views
7

Nie mogę sprawić, że mój obraz PIL będzie działał na płótnie. Kod:Jak otworzyć obraz PIL w Tkinter na płótnie

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

Błąd:

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' 

muszę używać PIL obrazy nie PhotoImages bo chcę zmienić rozmiar grafiki. Proszę nie sugerować przejścia na Pygame, ponieważ chcę używać Tkintera.

+1

Jestem zdezorientowany - mówisz, że nie chcesz używać 'PhotoImage's, ale twój kod używa' PhotoImage'. Czy masz na myśli, że chcesz użyć 'ImageTk.PhotoImage' zamiast' Tkinter.PhotoImage'? – Brionius

+1

Czy próbowałeś czytać dokumenty dla 'PhotoImage'? Zajmuje obiekt obrazu lub tryb i rozmiar. Ty też tego nie przekazujesz; przekazujesz mu nazwę pliku. ('KeyError' na' return _modes [mode] 'sprawia, że ​​oczywiste jest, że stara się traktować nazwę pliku jako tryb ... ale nie ma znaczenia, który z nich próbował, to by się nie powiodło.) – abarnert

Odpowiedz

8

Spróbuj najpierw utworzyć obraz PIL, a następnie użyj go do utworzenia 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 jest to, co chciałem użyć, ponieważ chcę być w stanie zmienić rozmiar. – user164814

+0

raise ImportError ("Moduł _imaging C nie jest zainstalowany") ImportError: Moduł _imaging C nie jest zainstalowany – user164814

+0

@ user164814 Ach, jesteś gotowy na zabawę. Brakuje pliku binarnego PIL - jest to problem z instalacją PIL, a nie z kodem. Zobacz [ten artykuł] (http://effbot.org/zone/pil-imaging-n-installed.htm). Jeśli użyłeś MacPorts do zainstalowania PIL, spróbuj samodzielnie zainstalować system. Powodzenia. – Brionius

2

Można importować wiele formatów obrazu i zmieniać rozmiar za pomocą tego kodu. "basewidth" ustawia szerokość obrazu.

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

(. Stare pytanie, ale odpowiedzi do tej pory są tylko pół-pełna)

Czytaj docs:

class PIL.ImageTk.PhotoImage(image=None, size=None, **kw) 
  • image - albo obrazu PIL lub ciąg znaków. [...]
  • file - Nazwa pliku do załadowania obrazu z (przy użyciu Image.open(file)).

Więc w swojej przykład użyć

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

lub jawnie

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

(I pamiętaj - jak to było prawidłowo: Przechowywać odniesienie do obiektu obrazu w programie Python, inaczej jest zebrany na śmieci zanim go zobaczysz.)

Powiązane problemy