[Python-ml-jp 5260] Re: イメージ・オブジェクトの直列化について

十河 満 coolhead @ a1.mbn.or.jp
2011年 8月 2日 (火) 04:47:00 JST


Shun-ichi Gotoさん アドバイスありがとうございます。

(2011/08/01 16:49), Shun-ichi Goto wrote:
> 2011年8月1日15:02 十河 満<coolhead @ a1.mbn.or.jp>:
>> できるように、例えば、『秒針』なら1秒毎の透過gifを予め作成してお
>> き、1秒毎に差替える戦略です。なお1つのgifは2〜3KBです。
>> PCなら何の問題も無いのですが、WMだとプログラム空間が32MBとCPUが
>> 非力なので、全イメージをメモリ内に取込もうとすると、TkinterCEの
>> エラーがポップアップするし、逆に、1秒毎にファイルから読込もうと
>> すると、秒抜けするし、で苦労してます。
> 
> メモリの問題については1枚の秒針画像のみを保持し、各秒数でその都度メモリ上で
> 回転させて秒針画像をダイナミックに作って描画するというのはどうでしょうか。
> (保持はしない)
> 秒数(方向)によって絵柄が違うとかいうならばこの手は使えませんが。
> 
> TkもCEも疎いですが、Tcl/Tkでの画像操作ライブラリはImgとかあるけど
> CEだと使えなさそう(?)なので、CE用のPILを使ったらいいのかも。
> http://code.google.com/p/pilce/downloads/list
> 

実は、元々の秒針をPC上でPIL使って回転させつつ秒単位の透過GIFを生成した
のですが、PILceを使ってWM上でこれやると相当負荷がかかるだろうと思い、
止めました。それと、自由に絵柄も修正できるのも有かなと思ってます。

>> そこで、tk.PhotoImageオブジェクトを外部辞書として、shelveで読書き
>> しようとしたら、次のエラーを吐きました。
>>
>> #1#
>>   File "Test.py", line 24, in<module>
>>     dic["IMAGE"] = img
>>   File "c:\Python27\lib\shelve.py", line 132, in __setitem__
>>     p.dump(value)
>> cPickle.UnpickleableError: Cannot pickle<type 'tkapp'>  objects
>>
>> pickle、cPickleもやってみましたが、同じでした。
> 
> 調べてはいませんが、トレースバックを見る限り PhotoImage オブジェクトは
> 何らかの形でtkappへの参照を保持してるようなので、無理なんでしょう。
> 
> 画像データがどれほどの大きさのものなのかわかりませんが、

携帯電話で使うので、だだの2〜3KBのGIFファイルで、300x300pixel程度
です。

> 秒抜けするほどってのはあからさまなオーバーヘッドがどこかにあるように思えます。
> まずは計測してその箇所を回避するようにすべきかもしれません。
> 

主なステートメントの処理時間(300回の平均)
+--------------------------------------------+------+------+
:                                            :  PC  : WM ※:
+--------------------------------------------+------+------+
:self.cvs.delete(tk.ALL)                     :   0ms:   7ms:
+--------------------------------------------+------+------+
:self.img = tk.PhotoImage(file=fln)          :  15ms: 330ms:
+--------------------------------------------+------+------+
:self.cvs.create_image(                      :   9ms: 157ms:
:  0,0,anchor=tk.NW,image=self.img,tag=csec) :      :      :
+--------------------------------------------+------+------+
(※) time.time()が秒単位のため誤差大

この表の様に、PhotoImageにウェイトが高く、これをなんとかしたかった
のですが、このオブジェクトを内部に保存するとTkinterエラーとなるので
なんとかして外部に出したかったのです。



Python-ml-jp メーリングリストの案内