[PR]今日のニュースは
「Infoseek モバイル」


Python/Tkinterの画像データ

 華やかで親しみのもてるGUIを作ろうとするなら、アイコンなどの画像の使用は欠かせません。 業務用なら質実剛健でいいやんという方も多いでしょうが、 実際にそういうのの最前線にいる私(U谷)の個人的な意見では、 業務用にこそ適度な遊ぶゆとりが必要だと思うのですが。 というわけで画像ですが、Tk標準のPPM(Pbmplus Portable Pixmap) とGIF(CompuServe Graphics Interchange) フォーマットの画像ファイルを読んで表示することができます。

from Tkinter import *
import tkFileDialog

class App(Frame):

  def quit(self, event):
    self.master.destroy()

  def open(self, event):
    filename = tkFileDialog.askopenfilename()
    if filename != "":
      self.image1.config(file=filename)
      self.la.config(width=self.image1.width(), height=self.image1.height())

  def init(self):
    self.image1 = PhotoImage()
    la = self.la = Label(self, image=self.image1, bg="#000000",
                         width=100, height=100)
    la.bind("<Button-1>", self.open)
    la.bind("<Button-3>", self.quit)
    la.pack()

  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.master.title('Main')
    self.init()
    self.pack()

app = App(); app.mainloop()
# end.

スクリーンショット

 画像データはPython/TkinterではPhotoImageというクラスで、 そのコンストラクタで読む画像ファイルを指定しますが、 そのPhotoImageのインスタンスは必ずインスタンス変数(selfがついたの) に保持しないと表示に出てきてくれません。 で、その表示ですが、ラベルに張りつけるにはラベルのimage オプションに読みこんだPhotoImageを指定します。 キャンバスに描くには、キャンバスのcreate_image メソッドを使い、やはりimageオプションで指定します。

ちょっとメモ(8) - ローカル変数とインスタンス変数
 先ほどはPhotoImageの返す値は必ずself.をつけたインスタンス変数にセットしないといけないと書きましたが、
im0 = PhotoImage(file=dir+'up.gif')
im1 = PhotoImage(file=dir+'previous.gif')
im2 = PhotoImage(file=dir+'next.gif')
im3 = PhotoImage(file=dir+'modules.gif')
self.i = [im0, im1, im2, im3]
ローカル変数でも、このように、最終的にインスタンス変数か何かに代入できていればOKです。 理由はC言語のポインタチックに考えるとわかるかと思います。 PhotoImageはインスタンスのメモリアドレスを返すので、 im0、im1…はそのアドレスをもつわけですが、 そのアドレスをself.がついたインスタンス変数に保持していないと、 このメソッドから抜けてローカル変数im0、im1が消えた瞬間に、 それらのアドレスは「忘れられて」しまうので、 メモリ上のどこかに存在してはいますが、 そのアドレスがどこかという情報が完全に消えてしまい、 その画像の表示も操作も一切できなくなるためです。

セクションのサブメニューに戻る
(first uploaded 2000/04/23 last updated 2002/03/11)