2016-12-03 2 views
0

Ich habe ein Programm, das die ontimer Funktion verwendet, um die Farben in einem Turtle Grafik-Ampel von grün, gelb, rot und wieder zurück zu ändern. Hier ist das vollständige Programm dafür:Wie benutze ich hide/showturtle um einen Stoplight-Rechner in Python zu erstellen?

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

Nun aber ich im Wesentlichen das Gleiche tun will, aber durch hideturtle und showturtle verwenden. Ich habe die Funktion advance_state_machine insgesamt losgeworden. An seiner Stelle ist das, beginnend direkt nach 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, ich versuche, einen Weg zu Schleife Versteck zu schaffen und zeigt jede Schildkröte individuell mein erstes Programm zu imitieren. Ich könnte Code schreiben, um jede Schildkröte bei einem Timer bis unendlich zu verstecken und zu zeigen, aber ich würde es lieber alleine fortsetzen! Gibt es auch einen einfachen Weg, es so zu machen, dass, wenn ein Licht "an" ist, die anderen zwei "aus" sind, dargestellt als eine Dimmer-/ausgegraute Farbe, anstatt dass die Schildkröte vollständig verschwindet? Vielen Dank im Voraus für Hilfe/Beratung.

Antwort

0

Ich denke, Ihre State Machine ist der beste Teil Ihres Programms, und ähnelt in etwa, wie eine echte Ampel funktioniert. Wir werden es wieder gestellt, aber lassen Sie es die die roten ändern, gelb und grün Schildkröten geeignet:

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

Bitte beachte, dass wir müssen alle Lichter an einem bestimmten Zustandsänderung nicht ändern, schalten Sie einfach eine aus und ein anderes auf.

Verwandte Themen