2017-01-11 4 views
0

В разделе игры, которую я создаю, пользователь вводит имя пользователя. Имя пользователя и оценка пользователя сохраняются в объекте, который маринован во внешний файл, в котором есть другие маринованные объекты оценки.Итерирование через список объектов, загружаемых pickle

У меня тогда есть кнопка в пользовательском интерфейсе, которая при нажатии должна отображать самые высокие оценки всех игроков в порядке убывания.

Загрузите файл в список с кодом, который я нашел here.

Highscores = [] 
Highscores = pickle.load(open("Highscores.txt", "rb")) 

Затем я использую сортировку пузырьков для сортировки списка объектов, показанных ниже.

def bubbleSort(): 
    swapOccured = True 
    while swapOccured == True: 
     swapOccured = False 
     for i in Highscores: 
      if Highscores[i].score > Highscores[i + 1].score: 
       hold = Highscores[i + 1] 
       Highscore[i + 1] = Highscores[i] 
       Highscores[i] = Highscores[i + 1] 
       swapOccured = True 

Ошибка, которая становится Возвращается

for index in Highscores: 
TypeError: iteration over non-sequence 

Я посмотрел на другие вопросы, как это, например here но ошибка в том, что программа была перекручивание через объект не обхвата по списку объекты. Я почти уверен, что это не такая же ошибка, как в примере, я думаю, что это может быть с загрузкой в ​​список объектов с рассолом, но я застрял.

Любая помощь была бы принята с благодарностью.

+2

Определение рекордов как списка, прежде чем вы загружаете рассол, не изменяет того, что объект находится при его загрузке; он просто перезаписывает предыдущее значение. Ясно, что все, что было спасено в рассоле, не список. –

+0

@ DanielRoseman да. Я думаю, что я добавляю объекты в рассол, как будто это список, но это не так. Это код, который я использую, чтобы свалить его. 'currScore = calculateScore()' ' currUser = tkSimpleDialog.askstring ("", "Пожалуйста, введите имя пользователя:")' ' newHighscore = scoreEntry (currScore, currUser)' ' с открытыми (" Рекорды. txt "," ab ") как f: pickle.dump (newHighscore, f)' –

ответ

2

Точно так же как pickle.dump сбрасывает один объект в файл, pickle.load загружает один объект из файла. Если вам нужен список, вам необходимо будет загрузить их все:

with open("Highscores.txt", "rb") as score_file: 
    Highscores = [] 
    while True: 
     try: 
      Highscores.append(pickle.load(score_file)) 
     except EOFError: 
      break 
Смежные вопросы