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

十河 満 coolhead @ a1.mbn.or.jp
2011年 8月 1日 (月) 15:02:00 JST


ソガワと申します。また教えて下さい。

Windows Mobileの携帯端末に、アナログ時計が欲しかったので、Tkinter
で作成しています。針や文字盤を好みに合わせて、自由にカスタマイズ
できるように、例えば、『秒針』なら1秒毎の透過gifを予め作成してお
き、1秒毎に差替える戦略です。なお1つのgifは2〜3KBです。
PCなら何の問題も無いのですが、WMだとプログラム空間が32MBとCPUが
非力なので、全イメージをメモリ内に取込もうとすると、TkinterCEの
エラーがポップアップするし、逆に、1秒毎にファイルから読込もうと
すると、秒抜けするし、で苦労してます。
そこで、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もやってみましたが、同じでした。

#2#
Traceback (most recent call last):
  File "Test.py", line 26, in <module>
    pk_img = pk.dumps(img)
  File "c:\Python27\lib\pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "c:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "c:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\Python27\lib\pickle.py", line 725, in save_inst
    save(stuff)
  File "c:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "c:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "c:\Python27\lib\pickle.py", line 663, in _batch_setitems
    save(v)
  File "c:\Python27\lib\pickle.py", line 313, in save
    (t.__name__, obj))
pickle.PicklingError: Can't pickle 'tkapp' object: <tkapp object at
0x0224BE20>

#3#
Traceback (most recent call last):
  File "Test.py", line 27, in <module>
    pk_img = cpk.dumps(img)
cPickle.UnpickleableError: Cannot pickle <type 'tkapp'> objects

それで、PyJUGで翻訳して頂いた「ライブラリリファレンス」の12.1.4.
を読んで見たのですが、残念ながら良く分かりませんでした。
何方か、アドバイス頂けないでしょうか?

【テスト用コード】

# -*- coding: utf-8 -*-
import Tkinter as tk
import pickle  as pk
import cPickle as cpk
import shelve  as sv

IMG_B64 = """
R0lGODlhIQAUAMQZAPdoArXL5srKy/yDC9Li9cLY8d21jv8xEvX296elo+Hg4IKG
i/9bT/WZb2ZjYejKrqq6zf3r2fPbxe3x9uDr+JGYoKFsOP8SAP///wAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAEAABkALAAAAAAhABQAAAX/YCaOImaSaKqSphkNz9Su
NPo2TzMMhjEok5oQs9sBioOEotQyISYUBAKFiUQeRsABwB1YBAgMhUAoKMqFQkAw
mZaQgItcfiwWyOQ7Wg0BlnxcFwyDc3UNBBSJinl8fSVYcQwNDQwHhTCIbRObiWUB
EBUCGRgSRoKTlZcNQFBknZ4JC6JEA1oXB4MHlnJbO2MBacCNC7KjpbW8c5eYwnhj
oA5KIhOAytZHAmTCFJtQahXSozrI1hddFsDNiROeoEujcNe1XAsQEMLABJ8QDgvv
GAoSWJinpQsACw76VahQD9S9AAmjvcuAQAGgLFwAOAglQIGAWAkXVAjZJwiJUgi5
KyC0oFHUCAUeEyRgmKCjCgQfZWpcMDNcCpgw3aiYABRUx6BCko4galJpihAAOw==
"""
root = tk.Tk()
cvs = tk.Canvas(root, width=33, height=20, bg="#0000ff")
cvs.pack(fill=tk.BOTH)
img = tk.PhotoImage(data=IMG_B64)

#1# dic = sv.open("test.bin")
#1# dic["IMAGE"] = img
#1# dic.close()
#2# pk_img = pk.dumps(img)
#3# pk_img = cpk.dumps(img)

cvs.create_image(0, 0, anchor=tk.NW, image=img)
root.mainloop()


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