Pygame и Tilesets следовал инструкциям по использованию, но получаю ошибку «noneType».
Вопрос
Моя версия 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