实现一个红绿灯效果,每次红灯亮10秒,黄灯亮3秒,绿灯亮8秒,并在红绿灯右侧显示倒计时
时间: 2023-07-15 20:10:47 浏览: 83
这个任务可以通过 Python 中的 Tkinter 模块来实现,下面是一个简单的实现:
```python
import tkinter as tk
class TrafficLight:
def __init__(self, master):
self.master = master
self.master.title("Traffic Light")
self.master.geometry('300x200')
self.color = 'red'
self.time_left = 10
self.timer_id = None
self.create_widgets()
self.change_color()
def create_widgets(self):
self.canvas = tk.Canvas(self.master, width=100, height=250)
self.canvas.pack(side=tk.LEFT, padx=20)
self.red_light = self.canvas.create_oval(20, 20, 80, 80, fill='red')
self.yellow_light = self.canvas.create_oval(20, 100, 80, 160, fill='gray')
self.green_light = self.canvas.create_oval(20, 180, 80, 240, fill='gray')
self.countdown_label = tk.Label(self.master, text='', font=('Helvetica', 24, 'bold'))
self.countdown_label.pack(side=tk.RIGHT, padx=20)
def change_color(self):
if self.color == 'red':
self.canvas.itemconfig(self.red_light, fill='red')
self.canvas.itemconfig(self.yellow_light, fill='gray')
self.canvas.itemconfig(self.green_light, fill='gray')
self.time_left = 10
self.countdown_label.config(fg='red', text=f'{self.time_left}')
elif self.color == 'yellow':
self.canvas.itemconfig(self.red_light, fill='gray')
self.canvas.itemconfig(self.yellow_light, fill='yellow')
self.canvas.itemconfig(self.green_light, fill='gray')
self.time_left = 3
self.countdown_label.config(fg='black', text=f'{self.time_left}')
elif self.color == 'green':
self.canvas.itemconfig(self.red_light, fill='gray')
self.canvas.itemconfig(self.yellow_light, fill='gray')
self.canvas.itemconfig(self.green_light, fill='green')
self.time_left = 8
self.countdown_label.config(fg='green', text=f'{self.time_left}')
self.timer_id = self.master.after(1000, self.countdown)
self.color = {'red': 'yellow', 'yellow': 'green', 'green': 'red'}[self.color]
def countdown(self):
self.time_left -= 1
self.countdown_label.config(text=f'{self.time_left}')
if self.time_left == 0:
self.master.after_cancel(self.timer_id)
self.change_color()
root = tk.Tk()
tl = TrafficLight(root)
root.mainloop()
```
这个程序创建了一个 `TrafficLight` 类,它继承了 `tkinter.Frame` 类,并在其中创建了三个圆形 `Canvas` 元素,表示红灯、黄灯和绿灯。通过不断地改变这三个元素的颜色,来模拟红绿灯的变化。
程序还创建了一个 `countdown` 方法,用于显示红绿灯倒计时,并在倒计时结束后调用 `change_color` 方法,来切换红绿灯的颜色。