简体   繁体   中英

Python Turtle mainloop() usage

I have the following code from an online tutorial to learn event-based programming by making a stop light that changes state when the mouse is clicked. Here is the entirety of my code:

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

In the tutorial, they use:

wn.mainloop()

But I get the error:

File "stopLights.py", line 51, in <module>
    wn.mainloop()
AttributeError: '_Screen' object has no attribute 'mainloop'

and have to use

turtle.mainloop()

Why the difference? I am using Python 2.7 in Ubuntu; the example is in PyScripter. Thanks in advance.

It appears to be an error in the tutorial.

On line 4, they define wn = turtle.Screen() , which means that the later call to wn.mainloop() is equivalent to calling turtle.Screen().mainloop() .

This doesn't make any sense; as the error message states there is no .mainloop() method of turtle.Screen() . There is , however a .mainloop() method of the base turtle object, which is why calling that works.

I suspect it's an issue with the version of Python you're using being different than the version the tutorial is written for. In Python 3.5 on my system, an instance of the turtle.Screen class does indeed have a mainloop method, so the code you report as not working would do just fine.

There may be other issues with your code if you continue to use the wrong version of Python (though what you've included in the question seems to be part of the common subset of Python 2 and Python 3 other than the mainloop issue). I'd strongly recommend any new Python programmer start with Python 3 and only go back to Python 2 (and learn the differences between the versions) if they specifically need to use a library that hasn't been ported yet. Python 3 is the future, and library support is pretty good these days!

打印(“姓名+姓氏”)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM