2017-01-15 3 views
0

私が作ったゲームでカスタムマップを作成するAPIを作ろうとしていますが、空のリストと辞書を書き込むだけです。Shelveは空白リスト/辞書を書きます

私はそのようにそれを保存しよう:ためのテクスチャ 「風」のファイルパスのための変数 「テクスチャ」として扱われている名前のマップ 「NAME_1」の示す名称について 「名前」あなたはwriteback=Trueを使用してファイルを開く必要があり

import tkinter.filedialog as tfd 
import shelve 
import shutil as os 

file1 = shelve.open("info") 

if "written" in file1: 
    pass 
else: 
    file1["name"] = [] 
    file1["name_1"] = [] 
    file1["textures"] = {} 
    file1["wind"] = {} 
    file1.close() 
    file1 = shelve.open("info") 

name = input("Name: ") 

name1 = input("Name zur Variablenspeicherung: ") 

wind = input("Wind (*-*): ") 

print("Wähle eine 1200x820 GIF-Datei als Hintergrund aus") 
texture = tfd.askopenfilename() 
os.copy(texture,"textures/"+texture.split("/")[-1].split("\\")[-1]) 
texture = "custom/textures/"+texture.split("/")[-1].split("\\")[-1] 

print("Schreibe Datei...") 

file1["name"].append(name) 
file1["name_1"].append(name1) 
file1["textures"][name1] = texture 
file1["wind"][name1] = [int(wind.split("-")[0]),int(wind.split("-")[1])] 
file1["written"] = 1 

file1.close() 

答えて

1

:HERESに私のコードを

を吹いています風の量

file1 = shelve.open("info", writeback=True) 
から

:ので、Pythonのセマンティクスの

可変永続的な辞書のエントリが変更されると、棚は知ることができません。デフォルトでは、変更されたオブジェクトはシェルフに割り当てられたときにのみ書き込まれます(例を参照)。 オプションのwritebackパラメータがTrueに設定されている場合、アクセスされたすべてのエントリもメモリにキャッシュされ、sync()およびclose()に書き戻されます。これは、永続的なディクショナリ内の変更可能なエントリを変更するのに手軽にすることができますが、多くのエントリがアクセスされると、キャッシュに対して膨大なメモリを消費する可能性があります。 (どのアクセスされたエントリが変更可能か、どのエントリが実際に変更されたのかを判断する方法はありません)。あなたは、そのキーを設定するとき

+0

おかげで、私はそれを試してみましょう。 – Jerrynicki

1

shelveは、キーに変更を書き出します。値の変更を検出することはできません。辞書に追加するか、またはの値がの辞書のキーに割り当てても、検出されません。 shelve documentationから

:可変永続的な辞書のエントリが変更されたときにそのためのPythonのセマンティクスの

棚を知ることはできません。デフォルトでは、変更されたオブジェクトはシェルフに割り当てられたときにのみ書き込まれます(例を参照)。オプションのwritebackパラメータがTrueに設定されている場合、アクセスされたすべてのエントリもメモリにキャッシュされ、sync()およびclose()に書き戻されます。永続的なディクショナリ内の変更可能なエントリを変更するのに手軽にすることができますが、多くのエントリがアクセスされると、キャッシュに膨大なメモリを消費し、アクセスされたエントリがすべて書き戻されるため、どのアクセスされたエントリが変更可能か、どのエントリが実際に変更されたのかを判断する方法はありません)。

太字強調。

どちらかがTruewritebackパラメータを設定(および欠点を受け入れる):

file1 = shelve.open("info", writeback=True) 

または明示的にバックキーに割り当てる:

names = file1["name"] 
names.append(name) 
file1["name"] = names