12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #!/usr/bin/env python3
- import asyncio
- import datetime
- from async_realtime_environment import AsyncRealtimeEnvironment
- from nicegui import ui
- start_time = datetime.datetime.now()
- def clock(env):
- while True:
- simulation_time = start_time + datetime.timedelta(seconds=env.now)
- clock_label.text = simulation_time.strftime('%H:%M:%S')
- yield env.timeout(1)
- def traffic_light(env):
- while True:
- light.classes('bg-green-500', remove='bg-red-500')
- yield env.timeout(30)
- light.classes('bg-yellow-500', remove='bg-green-500')
- yield env.timeout(5)
- light.classes('bg-red-500', remove='bg-yellow-500')
- yield env.timeout(20)
- async def run_simpy():
- env = AsyncRealtimeEnvironment(factor=0.1) # fast forward simulation with 1/10th of realtime
- env.process(traffic_light(env))
- env.process(clock(env))
- try:
- await env.run(until=300) # run until 300 seconds of simulation time have passed
- except asyncio.CancelledError:
- return
- ui.notify('Simulation completed')
- content.classes('opacity-0') # fade out the content
- # define the UI
- with ui.column().classes('absolute-center items-center transition-opacity duration-500') as content:
- ui.label('SimPy Traffic Light Demo').classes('text-2xl mb-6')
- light = ui.element('div').classes('w-10 h-10 rounded-full shadow-lg transition')
- clock_label = ui.label()
- # start the simpy simulation as an async task in the background as soon as the UI is ready
- ui.timer(0, run_simpy, once=True)
- ui.run()
|