2017-04-10 58 views
1

我有一个在Python中的交通灯模拟器,它运行正常,但第一次运行后它刚刚结束,我需要它在一个循环,例如红 - 黄 - 绿,然后再次红 - 黄绿色等等。我在这里错过了什么?我是新来的Python,如果这是一个noob问题,请不报 下面是我的代码:交通灯模拟器错误

import time 
from time import sleep 
from tkinter import * 
tk=Tk() 
win=Canvas(tk, width=55, height=200) 
win.pack() 
#functions 
def red(a): 
for i in range(a): 
    red=win.create_oval(5,5,50,50, fill="red") 
    tk.update() 
    time.sleep(0.05) 
def redb(a): 
for i in range(a): 
    red=win.create_oval(5,5,50,50, fill="black") 
    tk.update() 
    time.sleep(0.05) 
def amber(a): 
for i in range(a): 
    amber=win.create_oval(5,55,50,100, fill="orange") 
    tk.update() 
    time.sleep(0.05) 
def amberb(a): 
for i in range(a): 
    amber=win.create_oval(5,55,50,100, fill="black") 
    tk.update() 
    time.sleep(0.05) 
def green(a): 
for i in range(a): 
    green=win.create_oval(5,105,50,150, fill="green") 
    tk.update() 
    time.sleep(0.05) 
def greenb(a): 
for i in range(a): 
    green=win.create_oval(5,105,50,150, fill="black") 
    tk.update() 
    time.sleep(0.05) 
def lights(): 
red=win.create_oval(5,5,50,50, fill="black") 
amber=win.create_oval(5,55,50,100, fill ="black") 
green=win.create_oval(5,105,50,150, fill="black") 
#end of functions 
#calling the functions 

lights() 
red(30) 
redb(1) 
amber(10) 
amberb(1) 
green(30) 
greenb(1) 

tk.mainloop() 
+0

每次绘制和重绘“灯光”似乎都没有必要。如果您保持对每个灯的引用,则可以使用[itemconfig](http://effbot.org/tkinterbook/canvas.htm) – asongtoruin

回答

0

您需要在光改变代码的循环:

lights() 
while True: # use a better termination condition here 
    red(30) 
    redb(1) 
    amber(10) 
    amberb(1) 
    green(30) 
    greenb(1) 

请注意, :

for i in range(a): 
    amber=win.create_oval(5,55,50,100, fill="black") 
    tk.update() 
    time.sleep(0.05) 

是一样的:

amber=win.create_oval(5,55,50,100, fill="black") 
tk.update() 
time.sleep(0.05 * a) 

因为for循环只是重新绘制椭圆形并睡眠0.05秒a次。

+0

简单地更改它的颜色。谢谢,它有帮助,但是没有得到使用而终止条件? –

+0

'while True'将无限期运行。使用一些用户输入,例如按下按钮或按键,或者更容易,循环N秒。 –

+0

这样如何 导入时间 t_end =了time.time()+ 60 * 15 而了time.time()