Pygame和Tilesets,遵循使用说明,但我得到“noneType”错误

时间:2012-07-25 22:25:23

标签: image graphics pygame 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

我在for x, row in enumerate(table): *中收到了Nonetype错误。我尝试了各种各样的东西,甚至移动了tileset本身,并改变了文件类型。我也尝试过其他代码,比如range。

我过去曾设法加载图片,这是我第一次尝试使用图块集。图块集有9个16x16图块,并且它们有一些透明度(因此convert_alpha())。

那么,有谁可以说我为什么在这里遇到NoneType错误?这与图像有关吗? (注意,“for tileX in range”中有3个的原因是它不接受教程中设置为第四的计算,所以我自己做了数学计算。)

  • 修改:在说明中无意中输入了for x, row in range(table):而不是for x, row in enumerate(table):

1 个答案:

答案 0 :(得分:0)

您没有发布完整代码,或者犯了错误:上面的代码中没有for x, row in range(table)行。使用此特定代码,您似乎尝试从range函数中提取两个变量,但它一次只返回一个值。

您可能打算输入for x, row in enumerate(table)。在这种情况下,您需要在调用table = load_tileset('tableset.gif', 16, 16)时返回一个对象,因为除非向return某个对象明确告知任何给定的函数,否则它将返回None,这就是为什么该行是给你带来麻烦,因为type的{​​{1}}是None

以下是返回Nonetype然后返回字符串None的函数的示例:

a returned string