2016-07-07 3 views
0

У меня есть следующий код от online tutorial, чтобы узнать о программировании на основе событий, сделав стоп-сигнал, который изменяется при нажатии мыши. Вот полнота моего кода:Python Turtle mainloop() использование

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() 

Почему разница? Я использую Python 2.7 в Ubuntu; пример находится в PyScripter. Заранее спасибо.

ответ

2

Это ошибка в учебнике.

В строке 4 они определяют wn = turtle.Screen(), что означает, что более поздний вызов wn.mainloop() эквивалентен вызову turtle.Screen().mainloop().

Это не имеет никакого смысла; как указано в сообщении об ошибке, нет способа .mainloop()turtle.Screen(). Там is, однако a .mainloop() метод базы turtle объект, который почему звонит, что работает.

+0

Ahh, спасибо, что расчистили его. – DDauS

+0

FYI, нет .mainloop() * метод * объекта черепахи - turtle.mainloop() - это * функция * вызов в библиотеку черепах. Python 2 определяет mainloop() как функцию верхнего уровня, которая является синонимом TK.mainloop. Python 3 определяет mainloop() как метод Screen (через TurtleScreen через TurtleScreenBase), который вызывает TK.mainloop(), и, как многие другие методы экрана, также определяются (программно) как функция верхнего уровня, которая вызывает метод с тем же именем на единственном экземпляре Screen. Использование Python 2..mainloop() должно работать в Python 3, но обратное зависит от того, как оно было вызвано. – cdlane

+0

@cdlane _ >> нет метода .mainloop() объекта черепахи - turtle.mainloop() - вызов функции в библиотеку черепах. Не могли бы вы рассказать об этом? Я думал, что все методы - это функции, связанные с объектом. – DDauS

1

Я подозреваю, что проблема с версией Python, которую вы используете, отличается от версии, на которой написано учебное пособие. В Python 3.5 в моей системе экземпляр класса turtle.Screen действительно имеет метод mainloop, поэтому код, который вы сообщаете как не работающий, будет очень хорошим.

Возможно, возникли другие проблемы с вашим кодом, если вы продолжаете использовать неправильную версию Python (хотя то, что вы включили в вопрос, похоже, является частью общего подмножества Python 2 и Python 3, кроме mainloop выпуск). Я настоятельно рекомендую, чтобы любой новый программист Python начинал с Python 3 и возвращался только к Python 2 (и изучал различия между версиями), если им специально нужно использовать библиотеку, которая еще не была перенесена. Python 3 - это будущее, а поддержка библиотеки в наши дни очень хороша!

+0

Имеет смысл. Я начинал с 3, но, к сожалению, мне пришлось вернуться к 2.7, потому что мне нужно работать со старым кодом – DDauS