
| ■ | Python/Tkinterの画像データ |
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)