[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 メーリングリストの案内