import tkinter as tk
from tkinter import ttk, messagebox
import random
import datetime
import [Link] as plt
from [Link].backend_tkagg import FigureCanvasTkAgg
# ================================
# 🚦 Window Config
# ================================
root = [Link]()
[Link]("Smart Traffic Prediction - Tamil Nadu")
[Link]("1000x720")
[Link](bg="#f3f3f3")
# ================================
# 📍 Locations + Streets
# ================================
streets = {
"Chennai - T Nagar": [
"Usman Road", "Pondy Bazaar", "Ranganathan Street",
"G.N. Chetty Road", "Mambalam Main Road"
],
"Chennai - Anna Nagar": [
"3rd Avenue", "2nd Avenue", "Shanthi Colony",
"4th Main Road", "Tower Park Road"
],
"Chennai - OMR IT Corridor": [
"Navallur Road", "Sholinganallur Main Road", "Thoraipakkam Road",
"Karapakkam IT Road", "Semmancheri Signal"
],
"Coimbatore - Gandhipuram": [
"Cross Cut Road", "100 Feet Road", "Town Hall Road",
"DB Road", "Avinashi Link Road"
],
"Madurai - Anna Nagar": [
"11th Street", "Roundana Road", "Simmakkal Road",
"Kamarajar Street", "Narayanapuram Main"
],
}
# ================================
# 🏷 Title
# ================================
title_lbl = [Link](
root,
text="🚦 Smart Traffic Prediction (Tamil Nadu Streets)",
font=("Arial", 16, "bold"),
bg="#f3f3f3"
)
title_lbl.pack(pady=10)
# ==================================
# 📌 INPUT FRAME
# ==================================
input_frame = [Link](root, bg="#f3f3f3")
input_frame.pack(pady=5)
# ---------- Row 1: Location & Street ----------
[Link](input_frame, text="📍 Location", font=("Arial", 11),
bg="#f3f3f3").grid(row=0, column=0, padx=8, pady=6, sticky="w")
loc_var = [Link]()
loc_box = [Link](input_frame, textvariable=loc_var,
width=30, state="readonly")
loc_box["values"] = list([Link]())
loc_box.current(0)
loc_box.grid(row=0, column=1, padx=8, pady=6)
[Link](input_frame, text=" Street", font=("Arial", 11),
bg="#f3f3f3").grid(row=0, column=2, padx=8, pady=6, sticky="w")
street_var = [Link]()
street_box = [Link](input_frame, textvariable=street_var,
width=30, state="readonly")
street_box["values"] = streets[loc_box.get()]
street_box.current(0)
street_box.grid(row=0, column=3, padx=8, pady=6)
def update_street_list(event):
"""Update street options when location changes."""
location = loc_box.get()
street_box["values"] = streets[location]
street_box.current(0)
loc_box.bind("<<ComboboxSelected>>", update_street_list)
# ---------- Row 2: Time & Generate ----------
[Link](input_frame, text="⏰ Time (7-23)", font=("Arial", 11),
bg="#f3f3f3").grid(row=1, column=0, padx=8, pady=6, sticky="w")
time_var = [Link](value=9)
time_spin = [Link](input_frame, from_=7, to=23,
textvariable=time_var, width=8)
time_spin.grid(row=1, column=1, padx=8, pady=6, sticky="w")
# placeholder for button – defined after generate() to avoid forward reference
generate_btn = None
# ================================
# 📋 REPORT FRAME
# ================================
report_frame = [Link](root, bg="#f3f3f3")
report_frame.pack(pady=10)
report_var = [Link]()
report_lbl = [Link](
report_frame,
textvariable=report_var,
justify="left",
bg="#ffffff",
fg="black",
width=90,
height=8,
bd=2,
relief="solid",
font=("Courier New", 10)
)
report_lbl.pack()
# ================================
# 📊 GRAPH FRAME
# ================================
graph_frame = [Link](root, bg="#ffffff", bd=2, relief="solid")
graph_frame.pack(padx=20, pady=10, fill="both", expand=True)
# ================================
# 🎯 GENERATE LOGIC
# ================================
def generate():
location = loc_box.get()
street = street_box.get()
time_sel = time_var.get()
# --- validation ---
if not street:
[Link]("Error", "Please select a Street.")
return
if not (7 <= time_sel <= 23):
[Link]("Error", "Enter a valid time between 7 and 23.")
return
# --- random traffic data for 7 AM - 11 PM (17 hours) ---
counts = [[Link](80, 580) for _ in range(17)]
hour_labels = [
(f"{i-12} PM" if i > 12 else f"{i} AM") for i in range(7, 24)
]
vehicles = counts[time_sel - 7]
max_val = max(counts)
cg = vehicles / max_val
# --- traffic zone logic ---
if cg <= 0.39:
zone = "🟢 LOW TRAFFIC"
msg = "👍 Good time to travel."
elif cg <= 0.69:
zone = "🟡 MODERATE TRAFFIC"
msg = "⚠ Slight delay possible."
else:
zone = "🔴 HIGH TRAFFIC"
msg = "🚫 Avoid travelling now."
today = [Link]().strftime("%d-%b-%Y, %A")
report_var.set(
f"""
📅 {today}
📍 {location}
{street}
⏰ {time_sel}:00 hrs
🚗 Vehicles: {vehicles}
🚦 Zone: {zone}
💡 Suggestion: {msg}
"""
)
# --- clear old graphs ---
for widget in graph_frame.winfo_children():
[Link]()
# ========== Scatter Plot ==========
fig1 = [Link](figsize=(4.5, 3.5), dpi=100)
ax1 = fig1.add_subplot(111)
colors = [
"green" if c <= max_val * 0.39 else
("yellow" if c <= max_val * 0.69 else "red")
for c in counts
]
[Link](counts, range(len(counts)), c=colors,
s=80, edgecolors="black")
ax1.set_xlabel("Vehicle Count")
ax1.set_ylabel("Time")
ax1.set_yticks(range(len(hour_labels)))
ax1.set_yticklabels(hour_labels)
canvas1 = FigureCanvasTkAgg(fig1, master=graph_frame)
[Link]()
canvas1.get_tk_widget().pack(side="left", padx=10, pady=10, expand=True)
# ========== Line Plot ==========
fig2 = [Link](figsize=(4.5, 3.5), dpi=100)
ax2 = fig2.add_subplot(111)
[Link](hour_labels, counts, marker="o", linewidth=2)
ax2.set_xticklabels(hour_labels, rotation=45, fontsize=8)
ax2.set_ylabel("Vehicles")
canvas2 = FigureCanvasTkAgg(fig2, master=graph_frame)
[Link]()
canvas2.get_tk_widget().pack(side="right", padx=10, pady=10, expand=True)
# now create the Generate button (after generate() is defined)
generate_btn = [Link](
input_frame,
text="Generate",
command=generate,
font=("Arial", 11, "bold"),
bg="#007bff",
fg="white",
pady=3,
padx=15
)
generate_btn.grid(row=1, column=2, padx=8, pady=6, sticky="w")
# ================================
# 🏁 START APP
# ================================
[Link]()