Pygame и Tilesets следовал инструкциям по использованию, но получаю ошибку «noneType».

StackOverflow https://stackoverflow.com//questions/11659589

Вопрос

Моя версия Python — 3.2, а Pygame — 1.9.1.

Я выполнил первую часть инструкций, найденных здесь: http://wiki.sheep.art.pl/Tiled%20Map%20in%20PyGame, с некоторыми изменениями для моего собственного набора тайлов:

def load_tileset(filename, width, height):
   image = pygame.image.load(filename).convert_alpha()
   imageWidth, imageHeight = image.get_size()
   tileSet = []
   for tileX in range(0, 3):
      line = []
      tileSet.append(line)
      for tileY in range(0, 3):
         rect = (tileX*width, tileY*height, width, height)
         line.append(image.subsurface(rect))
if __name__=='__main__':

   pygame.init()
   screen = pygame.display.set_mode((WIDTH, HEIGHT))
   pygame.display.set_caption('Tiled Background')
   screen.fill((240, 240, 255))
   table = load_tileset('tableset.gif', 16, 16)
   for x, row in enumerate(table):
      for y, tile in enumerate(row):
         screen.blit(tile, (x*24, y*24))
   pygame.display.flip()
   while pygame.event.wait().type != pygame.locals.QUIT:
        pass

Я получаю ошибку Nonetype в for x, row in enumerate(table):*.Я пробовал разные вещи, даже перемещал сам набор плиток и менял тип файла.Я также пробовал другие коды, такие как диапазон.

Раньше мне удавалось загружать изображения, но я впервые пытаюсь использовать набор плиток.Набор плиток состоит из 9 плиток размером 16х16, и в них присутствует некоторая прозрачность (отсюда и convert_alpha()).

Итак, может ли кто-нибудь сказать, почему я получил NoneType здесь ошибка?Это как-то связано с имиджем?(Обратите внимание: причина, по которой в поле «Для tileX в диапазоне» есть 3, заключается в том, что он не принимает расчет, установленный четвертым в руководстве, поэтому я просто выполнил математические вычисления самостоятельно.)

  • Редактировать:Случайно набрал: for x, row in range(table): вместо for x, row in enumerate(table): в описании.
Это было полезно?

Решение

Вы не публикуете полный код или допустили ошибку:нет никаких for x, row in range(table) строку в приведенном выше коде.С помощью этого конкретного кода вы, похоже, пытаетесь извлечь две переменные из range функция, но она возвращает только одно значение за раз.

Вы наверное имели в виду написать for x, row in enumerate(table).В этом случае вам нужно вернуть объект при вызове table = load_tileset('tableset.gif', 16, 16) потому что, если какой-либо функции явно не указано return объект, он вернется None и именно поэтому линия доставляет вам неприятности, потому что type из None является Nonetype

Вот пример функции, возвращающей None а затем возвращая строку, a returned string:

def thisFuncReturnsNone():
   pass

print 'what gets returned:', thisFuncReturnsNone()
>>> None

def thisFuncReturnsAString():
  return 'a returned string'

print 'what gets returned a second time:', thisFuncReturnsAString()
>>> a returned string
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top