PILイメージをキャンバスで機能させることができないようです。コード:
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()
エラー:
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'
画像のサイズを変更したいので、PhotoImagesではなくPIL画像を使用する必要があります。 Tkinterを使いたいので、Pygameへの切り替えを提案しないでください。
最初にPILイメージを作成してから、それを使用して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()
(古い質問ですが、これまでの回答は半分しか完了していません。)
ドキュメントを読む:
_class PIL.ImageTk.PhotoImage(image=None, size=None, **kw)
_
image
–PILイメージまたはモード文字列。 [...]file
–画像をロードするファイル名(Image.open(file)
を使用)。したがって、あなたの例では、
_image = ImageTk.PhotoImage(file="ball.gif")
_
または明示的に
_image = ImageTk.PhotoImage(Image("ball.gif"))
_
(そして覚えておいてください-あなたが正しくしたように:あなたのPythonプログラムで画像オブジェクトへの参照を保持してください、さもなければそれはあなたがそれを見る前にガベージコレクションされます。)
複数の画像形式をインポートし、このコードでサイズを変更できます。 「basewidth」は、画像の幅を設定します。
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()
私はこの問題について、次のことを見つけるまでしばらくの間、壁に頭をぶつけていました。
http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm
どうやら、PythonのガベージコレクターはImageTkオブジェクトをゴミ箱に捨てることができます。 (私のような)多くのウィジェットを使用するアプリは、この動作の影響を受けやすいと思います。