2016-10-25 13 views
0

私はTkinterでちょっとした試合をしていますが、pickleを使ったセーブ機能があります。ただし、保存しようとすると、次のメッセージがスローされます。ピックルはtkinterとは動作しません

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "C:\Users\Benedict\Documents\Python\Migrant Simulator\MigSim 2016.10\migrant-stimulator.py", line 260, in save 
    pickle.dump(self.game,file) 
_pickle.PicklingError: Can't pickle <class 'tkapp'>: attribute lookup tkapp on __main__ failed 

事は、私はピクルスにしようとしているデータはTkinterの関連は何も含まれていない、ので、それはそれはここで<class 'tkapp'>
であると言う理由を私は理解していないコードの関連ビットの要約です:

... 
class Game(object): 

    def __init__(self,name,nodes={},start=None,history=[]): 
     self.name=name 
     self.nodes=nodes 
     self.start=start 
     self.history=history 

class App: 

    def __init__(self, master): 
     self.master=master 
... 
    def save(self): 
     if self.file_name==None: 
      self.save_as() 
     file=open(self.file_name,'wb') 
     pickle.dump(self.game,file) # self.game is an instance of the Game class defined elsewhere 
     print(str(type(self.game))) 
     file.close() 

    def save_as(self): 
     self.file_name=filedialog.asksaveasfilename() 
     self.save() 
... 
root = Tk() 

app = App(root) 

root.mainloop() 

どうすればこの問題を解決できますか?私は関連する質問に示唆したように__getstate__を変更しようとしましたが、うまくいかなかった。

編集:決して気にしないでください、それは私のデータ構造の深いことがわかりました、私はBooleanVarを残しました。

+1

「self.game」とは何ですか? – furas

+0

@furas申し訳ありませんが、ゲームのインスタンスです、私はそれを私の質問に追加します –

+0

Gameクラスのtkinter要素は保持しますか? – furas

答えて

0

短い答えは、あなたは何か関連するtkinterをピケッとすることはできません。その理由は、tkinterアプリケーションは、メモリ内のGUIの状態を維持する組み込みのTclインタプリタを使用し、TclはPythonのpickle形式について何も知らないからです。 Tclインタープリタによって管理されるデータを保存して復元する方法はありません。

保存する情報をあるタイプのデータ構造に変換し、このデータ構造を保存して読み込む必要があります。例えば

def save(self): 
    data = {"name": self.name, 
      "nodes": self.nodes, 
      ... 
      } 
    with open('data.json', 'w') as f: 
     json.dump(data, f) 

def load(self): 
    with open('data.json') as f: 
     data = json.load(f) 
    self.name = data["name"] 
    self.nodes = data["nodes"] 
    ... 

あなたはTkinterのオブジェクト(例:などのウィジェット、キャンバスアイテムIDのリスト、)への参照を含む保存したい値のいずれかの場合は、それらを変換する必要があります何か他のものを起動して復元します。

関連する問題