AttributeError: 'str' has no attribute 'shape'

AttributeError: 'str' has no attribute 'shape'

编辑:对于一直试图解决这个问题的任何人,我感到非常抱歉...出于某种原因,在我的其他功能之一中,我有一个 for 循环

for turt in winningRowTurtles:
    winningRowTurtles[turt] = ''

我真的不知道为什么...很抱歉让您感到困惑!

我正在与 Python 进行连连四局游戏,我希望有四只乌龟去获胜的牌并闪现,一旦找到胜利。我有这个工作......但它只有在发现胜利时才有效,海龟在屏幕中间产卵并迅速隐藏(这会分散注意力)然后回到它们的位置。我想让它们在游戏开始时的设置阶段生成并隐藏,而不是在游戏结束时。这是我的代码:

winningRowTurtles = {}
for turt in range(4):
    winningRowTurtles[turt] = turtle.Turtle()
    winningRowTurtles[turt].up()
    winningRowTurtles[turt].ht()

下一个代码是在找到获胜者后发生的事情:

if winnerFound == 1:
    for turt in winningRowTurtles:
        winningRowTurtles[turt].shape('circle')
        winningRowTurtles[turt].color('blue')
elif winnerFound == 2:
    for turt in winningRowTurtles:
        winningRowTurtles[turt].shape('square')
        winningRowTurtles[turt].color('red')

然后我得到这个错误:

Traceback (most recent call last):
File "C:\[redacted]\Python\Connect Four!.py", line 353, in <module>
play_game()
File "C:\[redacted]\Python\Connect Four!.py", line 258, in play_game
winningRowTurtles[turt].shape('circle')
AttributeError: 'str' object has no attribute 'shape'

play_game() 是代码第二部分为运行的函数。有谁知道为什么?这似乎完全没有道理。我在 运行 其他代码之前将 winningRowTurtles[1,2,3,4] 定义为海龟,而不是字符串。提前致谢。

考虑:

for turt in range(4):

和:

I defined winningRowTurtles[1,2,3,4] before I ran the other code.

但是 range(4) 是 [0, 1, 2, 3]。我们希望您说的是:

I defined winningRowTurtles[0,1,2,3] before I ran the other code.

winningRowTurtles 使用字典允许您拥有从 1 而不是 0 开始的数组,但更容易引入索引错误 使得随机字符串更容易进入。即问题可能不是四只乌龟之一,而是因为你这样做而进入字典的额外条目:

for turt in winningRowTurtles:

假设字典中的所有内容都是乌龟。

我建议您将 winningRowTurtles 切换到一个数组以强制进行一致的索引并防止通过索引插入意外项目。

类似于:

winningRowTurtles = []

for _ in range(4):
    winningRowTurtles.append(turtle.Turtle())
    winningRowTurtles[-1].up()
    winningRowTurtles[-1].ht()

...

for turt in range(4):
    winningRowTurtles[turt].shape(winningRowTurtles[winnerFound].shape())
    winningRowTurtles[turt].color(winningRowTurtles[winnerFound].color())

winnerFound 的范围也是 0 - 3。

是的,你必须重新考虑一切都是从零开始而不是从一开始。

如果您真的想继续使用基于 one 的索引和字典,请务必适当调整 range()

for turt in range(1, 5):
    winningRowTurtles[turt] = turtle.Turtle()
    ...

无论哪种方式,您都需要检查索引以确保其一致。