我有online tutorial的以下代码来学习基于事件的编程,方法是在点击鼠标时制作一个改变状态的停止灯。以下是我的全部代码:
import turtle
turtle.setup(400,500)
wn = turtle.Screen()
wn.title("Tess becomes a traffic light!")
wn.bgcolor("lightgreen")
tess = turtle.Turtle()
def draw_housing():
tess.pensize(3)
tess.color("black","darkgrey")
tess.begin_fill()
tess.forward(80)
tess.left(90)
tess.forward(200)
tess.circle(40, 180)
tess.forward(200)
tess.left(90)
tess.end_fill()
draw_housing()
tess.penup()
tess.forward(40)
tess.left(90)
tess.forward(40)
tess.shape("circle")
tess.shapesize(3)
tess.fillcolor("green")
state_num = 0
def nextFSMstate():
global state_num
if state_num == 0:
tess.forward(70)
tess.fillcolor("orange")
state_num = 1
elif state_num == 1:
tess.forward(70)
tess.fillcolor("red")
state_num = 2
else:
tess.back(140)
tess.fillcolor("green")
state_num = 0
wn.onkey(nextFSMstate, "space")
wn.listen()
turtle.mainloop()
# example says wn.mainloop() but I get error. This works though
在教程中,他们使用:
wn.mainloop()
但我收到错误:
File "stopLights.py", line 51, in <module>
wn.mainloop()
AttributeError: '_Screen' object has no attribute 'mainloop'
并且必须使用
turtle.mainloop()
为何与众不同?我在Ubuntu中使用Python 2.7;这个例子是在PyScripter中。提前谢谢。
答案 0 :(得分:2)
教程中似乎是一个错误。
在第4行,他们定义wn = turtle.Screen()
,这意味着稍后调用wn.mainloop()
等同于调用turtle.Screen().mainloop()
。
这没有任何意义;如错误消息所述,.mainloop()
没有turtle.Screen()
方法。 是,但是基础.mainloop()
对象的turtle
方法,这就是调用它的原因。
答案 1 :(得分:2)
我怀疑使用与您编写的教程版本不同的Python版本存在问题。在我的系统上的Python 3.5中,turtle.Screen
类的实例确实具有mainloop
方法,因此您报告为不工作的代码就可以了。
如果继续使用错误版本的Python,您的代码可能还有其他问题(尽管您在问题中包含的内容似乎是Python 2和Python 3的常见子集的一部分,而不是mainloop
问题)。我强烈建议任何新的Python程序员从Python 3开始,如果他们特别需要使用尚未移植的库,则只返回Python 2(并了解版本之间的差异)。 Python 3是未来,现在库支持非常好!