这是我第一次来这里,我是 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
属性的字典对象。由于 .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()