属性错误: 'dict'对象没有属性'pencolor'



这是我第一次来这里,我是Python的新手。

当我写这段代码

import turtle
ws = turtle.Screen()
aTurtle = turtle.Turtle()
colors = [ "pink","yellow","blue","green","white","red"]
sketch = turtle.pen()
turtle.bgcolor("black")
for i in range(200):
sketch.pencolor(colors[i % 6])
sketch.width(i/100+1)
sketch.forward(i)
sketch.left(59)
turtle.done()

然后我得到这个错误黑屏

Traceback (most recent call last):
File "C:/Users/wi n7/AppData/Local/Programs/Python/Python37/Lib/draw1.py", line 10, in <module>
sketch.pencolor(colors[i % 6])
AttributeError: 'dict' object has no attribute 'pencolor'

首先,感谢您发布了一个最小的、完整的示例和带有堆栈跟踪的完整错误消息。这已经成功了一半——收集执行调试所需的所有信息(或将这些信息提供给其他人来帮您调试)。下一步是使用这些信息实际调试程序。我将详细地告诉你我是如何做的,这样你下次遇到任何问题时都可以自己做。

错误告诉我们sketch.pencolor失败,因为sketch是一个字典对象,没有.pencolor属性。由于.pencolorTurtle方法,您可能认为sketchTurtle对象。但是用print(type(sketch))打印错误行上方的类型或者查看错误消息告诉我们,sketch确实是一个字典(dict)。运行print(dir(sketch))进一步确认pencolor不是dict上可用的属性或方法。

因此,从故障点向后跟踪代码。sketch是如何出人意料地变成dict的?查找最后一个(也是唯一的)赋值:sketch = turtle.pen().

查看Turtle.pen()方法的文档,可以看到它返回的内容:

在"pen-dictionary"中返回或设置笔的属性

turtle库有一个有点奇怪的设计,没有参数的方法是getter返回一个值,而有参数的方法是setter设置turtle的属性。您在getter模式下使用.pen(),因为没有参数。所以sketch是笔式字典因为这是.pen()的返回值

这在语义上有点混乱,因为你可能认为你需要一支笔来画海龟。把笔想象成乌龟拿着的东西,但你不直接碰它,所以你不需要因为任何原因拿到笔,除了看看它的当前属性是什么,或者把它保存到永久存储或类似的东西。你可能会只设置钢笔属性。

另一个危险信号:未使用的变量。您花了时间创建aTurtle,但从未使用它做过任何事情。实际上,这是代替sketch使用的正确变量(尽管在Python中,正确的命名约定是snake_case,a_turtle)。

所有你需要做的是删除sketch = turtle.pen()和使用aTurtlesketch的地方。这才是你要画的真正的乌龟。

如果这样做有任何问题(你自己试试),下面是代码:

import turtle
a_turtle = turtle.Turtle()
colors = ["pink", "yellow", "blue", "green", "white", "red"]
turtle.bgcolor("black")
for i in range(200):
a_turtle.pencolor(colors[i % 6])
a_turtle.width(i / 100 + 1)
a_turtle.forward(i)
a_turtle.left(59)
turtle.done()

最新更新