2016-12-03 2 views
0

У меня есть программа, которая использует функцию ontimer, чтобы изменить цвета в стоп-сигнале черепахи черепа от зеленого, желтого, красного и обратно. Вот полная программа, которая:Как использовать hide/showturtle для создания стоп-кадра в Python?

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(): 
""" Draw a nice housing to hold the traffic lights """ 
    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(50) 

tess.shape("circle") 
tess.shapesize(3) 
tess.fillcolor("green") 


state_num = 0 


def advance_state_machine(): 
    global state_num 
    wn.ontimer(advance_state_machine, 2000) 
    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 


advance_state_machine() 
wn.mainloop() 

Теперь, однако, я хочу сделать по существу то же самое, но с использованием hideturtle и showturtle. Я полностью избавился от функции advance_state_machine. На его месте это, начиная сразу после draw_housing():

tess.penup() 
tess.hideturtle() 

green = turtle.Turtle() 
green.pu() 
green.forward(40) 
green.left(90) 
green.forward(50) 
green.shape("circle") 
green.shapesize(3) 
green.fillcolor("green") 

yellow = turtle.Turtle() 
yellow.pu() 
yellow.forward(40) 
yellow.left(90) 
yellow.forward(50) 
yellow.shape("circle") 
yellow.shapesize(3) 
yellow.forward(70) 
yellow.fillcolor("orange") 

red = turtle.Turtle() 
red.pu() 
red.forward(40) 
red.left(90) 
red.forward(190) 
red.shape("circle") 
red.shapesize(3) 
red.fillcolor("red") 

Esentially, я пытаюсь создать путь к петлевой скрываться и показывая каждую черепаху по отдельности, чтобы имитировать мою первую программу. Я мог бы написать код, чтобы скрыть и показать каждой черепахе по таймеру до бесконечности, но я предпочел бы, чтобы он продолжался сам по себе! Кроме того, есть ли какой-либо простой способ сделать это так, что, когда один свет «включен», другие два «выключены», представлены как цвет диммера/серого цвета, а не полностью исчезает черепаха? Заранее благодарим за помощь/совет.

ответ

0

Я думаю, что ваш государственный автомат является лучшей частью вашей программы и примерно напоминает, как работает настоящий светофор. Мы поместим его обратно, но пусть это изменить в красные, желтые и зеленые черепахи надлежащим:

from turtle import Turtle, Screen 

DARKRED = "#442222" 
DARKYELLOW = "#444433" 
DARKGREEN = "#224422" 

def advance_state_machine(state_num=[0]): # intentional dangerous default value 
    period = 3000 

    if state_num[0] == 0: 
     green.color("black", DARKGREEN) 
     yellow.color("black", "orange") 
     period = 1500 # yellow lights are shorter than red or green 

    elif state_num[0] == 1: 
     yellow.color("black", DARKYELLOW) 
     red.color("black", "red") 

    elif state_num[0] == 2: 
     red.color("black", DARKRED) 
     green.color("black", "green") 

    state_num[0] = (state_num[0] + 1) % 3 

    screen.ontimer(advance_state_machine, period) 

def draw_housing(turtle): 
    """ Draw a nice housing to hold the traffic lights """ 
    turtle.pensize(3) 
    turtle.color("black", "darkgrey") 
    turtle.begin_fill() 
    turtle.forward(80) 
    turtle.left(90) 
    turtle.forward(200) 
    turtle.circle(40, 180) 
    tess.forward(200) 
    turtle.left(90) 
    turtle.end_fill() 

screen = Screen() 
screen.setup(400, 500) 
screen.title("Tess becomes a traffic light!") 
screen.bgcolor("lightgreen") 

tess = Turtle() 
draw_housing(tess) 
tess.hideturtle() 

green = Turtle(shape="circle", visible=False) 
green.shapesize(3) 
green.pu() 
green.forward(40) 
green.left(90) 
green.forward(50) 
green.fillcolor("green") 
green.showturtle() 

yellow = Turtle(shape="circle", visible=False) 
yellow.shapesize(3) 
yellow.pu() 
yellow.forward(40) 
yellow.left(90) 
yellow.forward(120) 
yellow.fillcolor(DARKYELLOW) 
yellow.showturtle() 

red = Turtle(shape="circle", visible=False) 
red.shapesize(3) 
red.pu() 
red.forward(40) 
red.left(90) 
red.forward(190) 
red.fillcolor(DARKRED) 
red.showturtle() 

screen.ontimer(advance_state_machine, 3000) 

screen.mainloop() 

Обратите внимание, что мы не должны изменить все огни на любой изменения состояния, просто переверните прочь и другой сверху.

Смежные вопросы