AttributeError:' str'没有属性'形状'

时间:2016-05-28 22:25:18

标签: python turtle-graphics attributeerror

编辑:对于那些一直试图解决这个问题的人,我感到非常抱歉...在我的其他一个函数中有一个原因,我有一个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()是运行代码的第二部分的函数。有谁知道为什么?这似乎完全不合理。我在运行其他代码之前定义了winsRowTurtles [1,2,3,4] ...作为乌龟,而不是字符串。提前谢谢。

1 个答案:

答案 0 :(得分:0)

考虑:

  

范围内的turt(4):

  

在我运行其他代码之前,我定义了winsRowTurtles [1,2,3,4]。

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

  

我在运行其他代码之前定义了winsRowTurtles [0,1,2,3]。

使用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。

是的,你必须重新考虑所有的东西,而不是基于一个。

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

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

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