2017-01-15 4 views
0

Я пытаюсь создать API для создания пользовательских карт в игре, которую я сделал, но полка просто записывает пустые списки и словари.Shelve пишет пустые списки/словари

Я стараюсь хранить его так: «имя» за проявленное имя карты «ИМЯ_1» для имени, которое рассматривается в качестве переменной «текстуры» для FilePath текстуры «ветер» для количество ветра, который дует

Heres мой код:

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

Вам нужно открыть файл с writeback=True:

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

От docs:

Из-за семантики Python, полка не может знать, когда изменяемые настойчивый-запись словаря изменяется. По умолчанию модифицированные объекты записываются только при назначении полки (см. Пример). Если для параметра writeback установлено значение «Истина», все записи, к которым осуществляется доступ, также кэшируются в памяти и записываются обратно на 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 

 Смежные вопросы

  • Нет связанных вопросов^_^