HOME Python 書き込む

Appnedix 1. Widget に画像を張り込む


Label や Button などの、image または bitmap 属性のある Widget には画像を貼り付けることができます。

Tkinter モジュールだけだと貼り付けられるのは GIF, PPM, X bitmap の3種類だけですが、 Python Imaging Library (PIL) を使うとほとんど全ての画像を貼り付けることができます。

X bitmap を使うことはあまりなく、便利なのは GIF でしょう。

1. 画像ファイル (*.gif, *.ppm) の貼り付け

Tk.PhotoImage を使うことによって、 Tk標準のPPM(Pbmplus Portable Pixmap) とGIF(CompuServe Graphics Interchange) フォーマットの画像ファイルを読んで表示することができます。

例えば、次のようにして使います。

[code 1](label_gif.py)

01:     #! /usr/bin/env python
02:     
03:     import Tkinter as Tk
04:     
05:     CLOCK = 'meza-bl-2.gif'
06:     
07:     class Frame(Tk.Frame):
08:         def __init__(self, master=None):
09:             Tk.Frame.__init__(self, master)
10:             self.img = Tk.PhotoImage(file=CLOCK)
11:             il = Tk.Label(self, image=self.img)
12:             il.pack()
13:     
14:     
15:     if __name__ == '__main__':
16:         f = Frame()
17:         f.pack()
18:         f.mainloop()
まず、Tk.PhotoImage 関数で、イメージを読み取り、それを、 self.img に代入します。 イメージは、必ずインスタンス変数に代入する必要があります。そうしないと、関数を抜けたとたん変数のメモリーが 回収され、イメージが消えてしまうからです。それに対し、widget は、配置 (pack, grid, place) してしまえば 消えることはないので、それを表す変数は一時的な変数でも差し支えありません。

2. その他の画像ファイル (*.jpg, *.png, etc) の貼り付け

Python Imaging Library (PIL) を利用すると 30 種類以上のイメージを使うことができます。 また、さまざまな画像の加工ができます。

[code 2](label_png.py)

01:     #! /usr/bin/env python
02:     
03:     import Tkinter as Tk
04:     from PIL import Image, ImageTk
05:     
06:     CLOCK = 'meza-bl-2.png'
07:     
08:     class Frame(Tk.Frame):
09:         def __init__(self, master=None):
10:             Tk.Frame.__init__(self, master)
11:             image = Image.open(CLOCK)
12:             self.img = ImageTk.PhotoImage(image)
13:     
14:     
15:             il = Tk.Label(self, image=self.img)
16:             il.pack()
17:     
18:     
19:     if __name__ == '__main__':
20:         f = Frame()
21:         f.pack()
22:         f.mainloop()
[code 1], [code 2] ともに右に示す window を表示します。
meza-bl-2.gif, meza-bl-2.pngを ダウンロードして試してみてください。

3. Tk に含まれている bitmap の貼り付け方

Tk の built-in ビットマップは Tk.Label の 'bitmap' オプションで、貼り付けることができます。 また、X bitmap フォーマットのファイルはファイル名の最初に '@' をつけることで読み込むことができます。 詳しくは Tkinter reference: 4.7. Bitmaps を見てください。