簡體   English   中英

Python / Pygame顏色不是元組:用作字典鍵時出現不可散列的類型錯誤

[英]Python/Pygame colours are no tuples: unhashable type error when used as dictionary keys

粗糙的背景:

我在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)))

有人知道這里的問題是什么嗎? 我覺得這很有趣。 顏色不是元組,因此不能散列,但是當我問是否等於元組時,返回的是“ True”。

我還嘗試將所有顏色定義為元組,並且效果也很好。 但是這種方法比我當前的方法慢得多。

有人知道我可以嘗試其他類型的事情嗎?

等於運算符適用於元組和pygame.Color的事實並不意味着您可以使用pygame.Color索引到字典中。 您在想這是相同的比較,但是命令需要關鍵對象是可哈希的。

PyGame.Color類型專門支持與元組的比較 ,前提是該元組的長度為3或4,並且包含0-255范圍內的整數(請參閱RGBAFromObj )。

在PyGame.Color頁面上有明確記錄:

顏色對象支持與其他顏色對象以及3或4個整數元素元組的相等比較

任何 Python類都可以通過實現__eq__方法來實現自定義相等性測試。

該類型還將所有內容實現為一個序列,返回R,G,B和A組件; 您可以通過在其上調用tuple()PyGame.Color轉換為元tuple()

tiledict[tuple(clr)]

並通過簡單地將元組作為單獨的參數傳遞,將其轉換回PyGame.Color對象:

pygame.Color(*tuple_of_rgba_ints)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM