我试图制作一个API来为我制作的游戏创建自定义地图,但搁置只是写空白列表和字典。
我尝试将其存储起来: "名称"显示地图名称 " NAME_1"对于被视为变量的名称 "纹理"对于纹理的文件路径 "风"因为吹的风量
继承我的代码:
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()
答案 0 :(得分:1)
您需要使用writeback=True
打开文件:
file1 = shelve.open("info", writeback=True)
来自docs:
由于Python语义,架子无法知道何时修改了可变的持久字典条目。默认情况下,只有在分配给工具架时才会编写修改的对象(请参见示例)。 如果可选的
writeback
参数设置为True,则所有访问的条目也会缓存在内存中,并在sync()
和close()
上回写; 这可以使其成为可能更容易改变持久字典中的可变条目,但是,如果访问了许多条目,它可能会占用大量内存用于缓存,并且它可以使关闭操作非常慢,因为所有访问的条目都被写回(没有办法确定哪些访问的条目是可变的,哪些是实际变异的。)
答案 1 :(得分:1)
shelve
会写出对密钥的更改。它无法检测到值的变化。附加到列表或分配到 value 的字典上的键将不会被检测到。
由于Python语义,一个架子无法知道何时修改了可变持久字典条目。默认情况下,只有在分配给工具架时才会编写修改的对象(请参见示例)。如果可选的
writeback
参数设置为True
,则所有访问的条目也会缓存在内存中,并写回sync()
和close()
;这可以使持久化字典中的可变条目变得更容易,但是,如果访问了许多条目,它可能会占用大量的内存用于缓存,并且它可以使关闭操作非常慢,因为所有访问的条目都被写回(没有办法确定哪些访问的条目是可变的,哪些实际上是变异的。)
大胆强调我的。
将writeback
参数设置为True
(并接受缺点):
file1 = shelve.open("info", writeback=True)
或明确指定回密钥:
names = file1["name"]
names.append(name)
file1["name"] = names