AttributeError:“dict”对象没有属性“pencolor”

问题描述 投票:0回答:1

这是我第一次来这里,我是 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'
python turtle-graphics python-turtle
1个回答
3
投票

首先,感谢您发布一个最小、完整的示例以及带有堆栈跟踪的完整错误消息。这就成功了一半——收集执行调试所需的所有信息(或将该信息提供给其他人来为您进行调试)。下一步是使用这些信息来实际调试程序。我将详细指导您完成操作,以便您下次可以自己解决可能遇到的任何问题。

该错误告诉我们

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

因此从故障点向后追踪代码。

sketch
怎么意外地变成了
dict
?找到最后一个(也是唯一一个)作业:
sketch = turtle.pen()

查看 Turtle.pen()

 方法
的文档揭示了它返回的内容:

在“笔字典”中返回或设置笔的属性

海龟库有一个有点奇怪的设计,其中没有参数的方法是返回值的getters,而有参数的方法是设置海龟属性的setters。由于没有参数,您在 getter 模式下使用

.pen()
。所以
sketch
是一个笔字典,因为这是
.pen()
的返回值。

这在语义上有点令人困惑,因为你可能认为你需要一支笔才能用乌龟画画。将笔视为乌龟握着的东西,但您不会直接触摸,因此除了查看其当前属性或将其保存为永久属性之外,您不需要出于任何原因获取笔。存储或类似的东西。您可能只会设置笔属性。

另一个危险信号:未使用的变量。您花了时间创建

aTurtle
,但从未对其做过任何事情。实际上,这是正确使用的变量,而不是
sketch
(尽管在 Python 中,正确的命名约定是 Snake_case,
a_turtle
)。

您需要做的就是删除

sketch = turtle.pen()
并在所有
aTurtle
所在的地方使用
sketch
。这才是你想要画的真正的乌龟。

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

from turtle import Screen, Turtle


a_turtle = Turtle()
colors = "pink", "yellow", "blue", "green", "white", "red"
Screen().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)

Screen().done()
© www.soinside.com 2019 - 2024. All rights reserved.