Python / Pygame颜色没有元组:用作字典键时不可用的类型错误

时间:2014-05-20 20:52:31

标签: python python-3.x dictionary

粗略背景:

我在Python / Pygame中编写了一些函数,用彩色迷你地图创建平铺水平贴图。小的一个像素代表大的一个像素。

现在我发现,使用Pygame的surface.get_at((x,y))获得的颜色不是元组,尽管它们看起来像......

黑色表面上get_at结果的简短示例:

surf = pygame.Surface((64, 64)).convert()
surf.fill((0, 0, 0))

print(surf.get_at((32, 32))

打印:

(0, 0, 0, 255)

所以我想,创建一个颜色为关键字的词典就像那样:

tiledict = {(0, 0, 0, 255): [tile list 1], (255, 0, 0, 255): [tile list 2], etc}

for y in range(0, tilemap.get_height()):
    for x in range(0, tilemap.get_width()):
        clr = tilemap.get_at((x, y))

        lvlmap.blit(tiledict[clr][random.randint(0, len(tiledict[clr]) - 1)]

结果:

    lvlmap.blit(tiledict[clr][random.randint(0, len(tiledict[clr]) - 1)]
TypeError: unhashable type: 'pygame.Color'

然而,当我将颜色定义为元组并将其用作键之前,它可以工作:

GRAY = (128, 128, 128, 255)

print(GRAY == clr)

的产率:

True

我有我的解决方法:我将字典键设为所有字符串然后以这种方式调用get_at

clr = str(tilemap.get_at((x, y)))

有人知道这里的问题是什么吗?我发现它很有趣。颜色不是元组,因此不可清洗,但是当我问,它是否等于元组时,返回的是#34; True" ...

我还尝试将所有颜色定义为元组,并且它也有效。但这种方法比我目前的方法慢。

有没有人知道我还能尝试什么,而不必去机会?

2 个答案:

答案 0 :(得分:2)

相等运算符适用于元组和pygame.Color这一事实并不意味着您可以使用pygame.Color索引到dict。你认为这是相同的比较,但是dicts需要关键对象是可以清除的。

答案 1 :(得分:2)

PyGame.Color类型具体为supports comparisons to tuples,前提是元组的长度为3或4,并且包含0-255范围内的整数(请参阅RGBAFromObj source)。

这是明确记录的on the PyGame.Color page

  

颜色对象支持与其他颜色对象以及整数的3或4个元素元组的等式比较

任何 Python类都可以通过实现__eq__ method来实现自定义相等性测试。

该类型还将所有内容实现为序列,返回R,G,B和A组件;您可以通过调用PyGame.Colortuple()转换为元组:

tiledict[tuple(clr)]

并通过简单地将元组作为单独的参数传递回一个PyGame.Color对象:

pygame.Color(*tuple_of_rgba_ints)