Python Turtle mainloop() 用法

Python Turtle mainloop() usage

我有以下来自 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 中。提前致谢。

教程中似乎有错误。

在第4行,他们定义了wn = turtle.Screen(),也就是说后面调用wn.mainloop()等同于调用turtle.Screen().mainloop().

这没有任何意义;由于错误消息指出 turtle.Screen() 没有 .mainloop() 方法。 ,但是基础turtle对象的.mainloop()方法,这就是调用它的原因。

我怀疑您使用的 Python 版本与教程编写的版本不同是一个问题。在我的系统上的 Python 3.5 中,turtle.Screen class 的一个实例确实有一个 mainloop 方法,因此您报告为不工作的代码就可以了。

如果您继续使用错误版本的 Python,您的代码可能存在其他问题(尽管您在问题中包含的内容似乎是 [=17= 的公共子集的一部分) ] 2 和 Python 3 除了 mainloop 问题)。我强烈建议任何新的 Python 程序员从 Python 3 开始,如果他们特别需要使用一个库,则只返回 Python 2(并了解版本之间的差异)还没有移植。 Python 3 是未来,这些天库支持非常好!