作者: Yukihiro Matsumoto
日時: 2005/12/20(08:23)
まつもと ゆきひろです

In message "Re: [TSpython:688] ---P は Python の P---0Ah"
    on Tue, 20 Dec 2005 00:13:49 +0900 (JST), kikwai@... (機械伯爵) writes:

|「さて、説明の続き。ラベルの最後だけど、pack ってい
|うメソッドを実行してるよね。これは、最終的に準備が
|ととのったから、実際に GUI に表示させるメソッドなん
|だ」

この例では子供がいないんで結果的にそういう動作をしてるんです
が、packを「表示させるメソッド」と呼んでしまうのはOusterhout
先生に悪い気がします。

|from Tkinter import *
|w = Tk()
|l = Label(w)
|l.pack()
|e = Entry(w, width=50)
|e.pack()
|def setImage(event):
| f = e.get()
| i = PhotoImage(file = f)
| l['image'] = i
|
|e.bind('<Return>',setImage)
|
|w.mainloop()
|
|「どう?」
|「論よりRUN。実行実行」
|「ほい、ぽちっとなっ!」
| エントリーオブジェクトだけのウィンドウが現れる。
|「じゃ、ファイル名を入れて、エンターとっ!」
| 画像を入れたと思しきラベルの領域は現れた。
| しかし肝心な画像は、そこには現れなかった。
|「な、なんでぇ〜っ!」
|「う〜ん、コレは難しいんだけど、i は関数で作られる
|一時的なオブジェクトだから、ラベルが参照し続けるこ
|とが出来ないんだ」
|「え〜? そんなんあり?」

これを見て、私も「な、なんでぇ〜っ!」と思いました。なんでな
んでしょう? 実際にglobalを入れると動きますが、全然納得でき
ません。iは変数であってオブジェクトでないし。

もしかして、Tkinterで、

  l['image'] = i

ってやってもTkのパスしか使わず、参照しているオブジェクトをGC
から保護してくれなかったりするんですかね。だとするとPython 
の良いところが台無しです。