-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathai_work.py
More file actions
226 lines (199 loc) · 12.9 KB
/
ai_work.py
File metadata and controls
226 lines (199 loc) · 12.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
import datetime
import requests
import difflib
import tkinter as tk
from tkinter import messagebox, ttk
# --- 1. DATA & CONFIGURATION ---
NIGERIA_LOCATIONS = [
# --- STATES & CAPITAL TERRITORY (37 Items) ---
"Abia", "Adamawa", "Akwa Ibom", "Anambra", "Bauchi", "Bayelsa", "Benue", "Borno",
"Cross River", "Delta", "Ebonyi", "Edo", "Ekiti", "Enugu", "FCT Abuja", "Gombe",
"Imo", "Jigawa", "Kaduna", "Kano", "Katsina", "Kebbi", "Kogi", "Kwara", "Lagos",
"Nasarawa", "Niger", "Ogun", "Ondo", "Osun", "Oyo", "Plateau", "Rivers", "Sokoto",
"Taraba", "Yobe", "Zamfara",
# --- LOCAL GOVERNMENT AREAS (774 Items) ---
"Aba North", "Aba South", "Abadam", "Abaji", "Abak", "Abakaliki", "Abaaji", "Abeokuta North",
"Abeokuta South", "Aboh Mbaise", "Abua-Odual", "Adavi", "Ado-Ekiti", "Ado", "Afijio", "Afigbo",
"Agaie", "Agatu", "Agwara", "Agege", "Aguata", "Ahiazu Mbaise", "Ahoada East", "Ahoada West",
"Ajaokuta", "Ajeromi-Ifelodun", "Ajingi", "Akamkpa", "Akinyele", "Akko", "Akoko-Edo",
"Akoko North-East", "Akoko North-West", "Akoko South-West", "Akoko South-East", "Akpabuyo",
"Akple", "Akuku-Toru", "Akure North", "Akure South", "Albasu", "Aleiro", "Alimosho",
"Alkaleri", "Amuwo-Odofin", "Anambra East", "Anambra West", "Anaocha", "Andoni", "Aninri",
"Aniocha North", "Aniocha South", "Anka", "Ankpa", "Apa", "Apapa", "Ado Odo-Ota", "Ardo Kola",
"Arewa Dandi", "Argungu", "Arigidi", "Arochukwu", "Asa", "Asari-Toru", "Askira-Uba", "Asari",
"Atani", "Atiba", "Atisbo", "Augie", "Auyo", "Awe", "Awgu", "Awka North", "Awka South",
"Ayamelum", "Ayedaade", "Aiyedire", "Aiyekire", "Azare", "Babura", "Badagry", "Bagudo",
"Bagwai", "Bakassi", "Bakori", "Bakura", "Balanga", "Bali", "Bama", "Bambam", "Banga",
"Bichi", "Bida", "Billiri", "Bindawa", "Binkolo", "Biu", "Bodinga", "Bogoro", "Boki",
"Boluwaduro", "Bomadi", "Bonny", "Borgu", "Boripe", "Borse", "Bosso", "Boyo", "Brass",
"Buji", "Bukkuyum", "Buruku", "Burutu", "Bussa", "Calabar Municipal", "Calabar South",
"Chanchaga", "Chara", "Chibok", "Chikun", "Choba", "Dala", "Damaturu", "Dambatta",
"Damboa", "Dambam", "Dandi", "Dandume", "Dange Shuni", "Danja", "Dan Musa", "Darazo",
"Dass", "Daura", "Dekina", "Demusa", "Degema", "Devi", "Dikwa", "Doguwa", "Doma",
"Dong", "Dukku", "Dunukofia", "Dutse", "Dutsi", "Dutsin-Ma", "East Mbaise", "Ebonyi",
"Edati", "Ede North", "Ede South", "Edu", "Efe", "Effurun", "Efon", "Egbado North",
"Egbado South", "Egbeda", "Egbedore", "Egor", "Ehime Mbano", "Ejigbo", "Ekeremor",
"Eket", "Ekiti East", "Ekiti West", "Ekiti South-West", "Ekwusigo", "Eleme", "Emuoha",
"Emure", "Enugu East", "Enugu North", "Enugu South", "Epe", "Esan Central", "Esan North-East",
"Esan South-East", "Esan West", "Ese Odo", "Eshiem", "Essien Udim", "Etche", "Ethiope East",
"Ethiope West", "Etim Ekpo", "Etinan", "Eti-Osa", "Etsako Central", "Etsako East",
"Etsako West", "Etung", "Ewekoro", "Ezeagu", "Ezinihitte Mbaise", "Ezinihitte", "Ezinifite",
"Ezza North", "Ezza South", "Fagge", "Fakai", "Faika", "Faskari", "Fika", "Fufure",
"Funakaye", "Fune", "Funtua", "Furaka", "Gabasawa", "Gada", "Gagarawa", "Gamawa",
"Gandi", "Ganjuwa", "Ganye", "Garki", "Garko", "Garun Mallam", "Gashaka", "Gassol",
"Gaya", "Gayan", "Gbako", "Gboko", "Gbonyin", "Gezawa", "Giade", "Giwa", "Gof",
"Gokana", "Gombe", "Gombi", "Goronyo", "Grie", "Gubio", "Gudu", "Guinter", "Guiter",
"Gujba", "Gulani", "Guma", "Gumel", "Gummi", "Gurara", "Guri", "Gusau", "Guzamala",
"Gwadabawa", "Gwagwalada", "Gwale", "Gwandu", "Gwaram", "Gwarzo", "Gwer East",
"Gwer West", "Gwiwa", "Gwoza", "Hadejia", "Hawul", "Hong", "Ibadan North",
"Ibadan North-East", "Ibadan North-West", "Ibadan South-East", "Ibadan South-West",
"Ibaji", "Ibarapa Central", "Ibarapa East", "Ibarapa North", "Ibeju-Lekki", "Ibeno",
"Ibesikpo Asutan", "Ibi", "Ibiono-Ibom", "Idah", "Idanre", "Ideato North", "Ideato South",
"Idemili North", "Idemili South", "Ido", "Ido-Osi", "Ifako-Ijaiye", "Ifedayo",
"Ifedore", "Ifelodun", "Ife Central", "Ife East", "Ife North", "Ife South", "Ifo",
"Igabi", "Igalamela-Odolu", "Igbo-Etiti", "Igbo-Eze North", "Igbo-Eze South", "Igho",
"Ihre", "Ihiala", "Ihitte/Uboma", "Ijebu East", "Ijebu North", "Ijebu North-East",
"Ijebu Ode", "Ijero", "Ijumu", "Ika", "Ika North-East", "Ika South", "Ikara",
"Ikeduru", "Ikeja", "Ikenne", "Ikole", "Ikom", "Ikono", "Ikorodu", "Ikot Abasi",
"Ikot Ekpene", "Ikpoba-Okha", "Ikwerre", "Ikwo", "Iky", "Ila", "Ilaser", "Ilaje",
"Ilema", "Ilesa East", "Ilesa West", "Illela", "Ilorin East", "Ilorin South",
"Ilorin West", "Imae", "Imeko Afon", "Ingawa", "Ilejemeje", "Imo", "Inisa",
"Ipokia", "Irepo", "Irua", "Isiala Mbano", "Isiala Ngwa North", "Isiala Ngwa South",
"Isinkan", "Isokan", "Isoko North", "Isoko South", "Isu", "Isuikwuato", "Itas/Gadau",
"Itesiwaju", "Ito", "Itu", "Iwaser", "Iwo", "Iwopin", "Iyo", "Iwajowa", "Jaba",
"Jada", "Jafun", "Jajere", "Jalingo", "Jama'are", "Janbako", "Janyer", "Jega",
"Jere", "Jibia", "Jigawa", "Jodu", "Jos East", "Jos North", "Jos South",
"Kabba/Bunu", "Kabo", "Kachia", "Kaduna North", "Kaduna South", "Kfin Hausa", "Kaga",
"Kagarko", "Kaiama", "Kaita", "Kajuru", "Kala/Balge", "Kalgo", "Kaltungo",
"Kano Municipal", "Karaye", "Karim Lamido", "Karu", "Katagum", "Katcha", "Katsina-Ala",
"Katsina", "Kaura Namoda", "Kaura", "Kauru", "Kazaure", "Kebbe", "Keana", "Keffi",
"Khana", "Kiba", "Kibiya", "Kiru", "Kiri", "Kiyawa", "Kofa", "Kogi",
"Koko/Besse", "Kokona", "Kolokuma/Opokuma", "Konduga", "Konshisha", "Kontagora",
"Kosofe", "Kaugama", "Kura", "Kurfi", "Kuron", "Kusada", "Kwali", "Kwande",
"Kwami", "Kware", "Kwaya Kusar", "Lafia", "Lagelu", "Lagos Island", "Lagos Mainland",
"Langtang North", "Langtang South", "Lapai", "Lassa", "Lau", "Lekki", "Lavun",
"Lere", "Logo", "Lokoja", "Mafa", "Magama", "Magumeri", "Mai'Adua", "Maifoni",
"Maigatari", "Maiha", "Maing", "Makarfi", "Makurdi", "Malam Madori", "Malumfashi",
"Mangu", "Mani", "Maradun", "Mariga", "Marte", "Mary", "Masham", "Mashi",
"Mashegu", "Mbat", "Mbiase", "Mbo", "Mbaitoli", "Michika", "Miga", "Mikang",
"Minjibir", "Minna", "Misau", "Moba", "Mobbar", "Mofa", "Mokwa", "Mol",
"Monguno", "Mopa-Muro", "Moro", "Moya", "Mpkar", "Much", "Mushin",
"Muya", "Mutum Biyu", "Nafada", "Nangere", "Nasarawa Eggon", "Nasarawa", "Ndokwa East",
"Ndokwa West", "Nembe", "New Bussa", "Ngala", "Nganzai", "Ngaski", "Ngor Okpala",
"Nguru", "Ningi", "Njikoka", "Nkanu East", "Nkanu West", "Nkwerre", "Nnewi North",
"Nnewi South", "Nsit Atai", "Nsit Ibom", "Nsit Ubium", "Nsukka", "Numan",
"Nwangele", "Obafemi Owode", "Obanliku", "Obi", "Obio-Akpor", "Obokun", "Obot Akara",
"Obubra", "Obudu", "Odeda", "Odigbo", "Odogbolu", "Odo Otin", "Odukpani",
"Offa", "Ofu", "Ogba/Egbema/Ndoni", "Ogbadibo", "Ogbaru", "Ogbomosho North", "Ogbomosho South",
"Oghara", "Ogoja", "Ogo Oluwa", "Ogor", "Ogori/Magongo", "Ogun Waterside", "Oguta",
"Ohafia", "Ohaji/Egbema", "Ohaoira", "Ohaukwu", "Ohimini", "Ohlun", "Ohonyi",
"Oji River", "Ojo", "Ojor", "Oju", "Okehi", "Okene", "Oke-Ero", "Okigwe",
"Okitipupa", "Okobo", "Okpe", "Okpoko", "Okrika", "Olamaboro", "Ola Oluwa",
"Olorunda", "Oluyole", "Omala", "Omuma", "Ona Ara", "Ondo East", "Ondo West",
"Onicha", "Onitsha North", "Onitsha South", "Onna", "Okpokwu", "Opobo/Nkoro",
"Oredo", "Orelope", "Oriade", "Oriire", "Orlu", "Orolu", "Oron",
"Orumba North", "Orumba South", "Orsu", "Oru East", "Oru West", "Ose",
"Oshimili North", "Oshimili South", "Oshodi-Isolo", "Osisioma", "Osun", "Ovia North-East",
"Ovia South-West", "Owan East", "Owan West", "Owerri Municipal", "Owerri North", "Owerri South",
"Owerri West", "Owo", "Oye", "Oyi", "Oyigbo", "Oyo East", "Oyo West",
"Oyun", "Paikoro", "Pankshin", "Patigi", "Port Harcourt", "Potiskum", "Qua'an Pan",
"Rabah", "Rafi", "Rano", "Remo North", "Rijau", "Rimi", "Rimin Gado",
"Ringim", "Riyom", "Rogo", "Roni", "Sabon Birni", "Sabon Gari", "Sabuwa",
"Safana", "Sagbama", "Sagamu", "Sakaba", "Ski East", "Ski West", "Samia",
"Sandamu", "Sangana", "Sanga", "Sapele", "Sardauna", "Shagamu", "Shagari",
"Shanga", "Shani", "Shanono", "Shira", "Shiroro", "Shongom", "Shomolu",
"Silame", "Soba", "Sokoto North", "Sokoto South", "Song", "Southern Ijaw",
"Suleja", "Sule Tankarkar", "Sunkani", "Surulere", "Tafa", "Tafawa Balewa",
"Talata Mafara", "Tambuwal", "Tangaza", "Tarauni", "Taruka", "Tarka", "Tarmuwa",
"Taura", "Tege", "Tepo", "Tofa", "Toh", "Toro", "Toto",
"Trand", "Tsafe", "Tsanyawa", "Tudun Wada", "Tureta", "Udenu", "Udi",
"Udu", "Udung-Uko", "Ughelli North", "Ughelli South", "Ukwuani", "Ullu",
"Umuahia North", "Umuahia South", "Umu Nneochi", "Ungogo", "Unuimo", "Uruan",
"Urue-Offong/Oruko", "Ushongo", "Ussa", "Uvwie", "Uyo", "Vandeikya", "Vandikya",
"Wamako", "Wamba", "Warawa", "Warji", "Warri North", "Warri South", "Warri South-West",
"Wasagu/Danko", "Wase", "Wudil", "Wukari", "Wurno", "Wushishi", "Yabo",
"Yagba East", "Yagba West", "Yakurr", "Yala", "Yamaltu/Deba", "Yankwashi",
"Yauri", "Yawuri", "Yenagoa", "Yola North", "Yola South", "Yoruba",
"Yusufari", "Zaki", "Zango", "Zangon Kataf", "Zaria", "Zing",
"Zurmi", "Zuru"
]
# --- 2. BACKEND ENGINE LOGIC ---
def get_weather(location):
url = f"https://wttr.in/{location},Nigeria?format=j1"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
return data["current_condition"][0]["temp_C"]
except Exception:
return None
def validate_and_suggest(user_input):
cleaned_input = user_input.strip().lower()
lookup = {loc.lower(): loc for loc in NIGERIA_LOCATIONS}
if cleaned_input in lookup:
return True, lookup[cleaned_input]
suggestions = difflib.get_close_matches(user_input, NIGERIA_LOCATIONS, n=3, cutoff=0.5)
return False, suggestions
# --- 3. GUI INTERACTION LOGIC ---
def check_weather_action():
# Get text from the entry box
raw_input = location_entry.get()
if not raw_input.strip():
messagebox.showwarning("Empty Input", "Please type a State or LGA name first!")
return
# Clear previous feedback texts
suggestion_label.config(text="")
result_label.config(text="Fetching weather...", fg="blue")
root.update_idletasks() # Refresh the view immediately
is_valid, result = validate_and_suggest(raw_input)
if is_valid:
location_name = result
temp = get_weather(location_name)
if temp is not None:
# Display success message in our app window
today = datetime.date.today()
current_time = datetime.datetime.now().time().strftime("%H:%M:%S")
output_text = f"📍 Location: {location_name}\n📅 Date: {today}\n⏰ Time: {current_time}\n\n🌡️ Temperature: {temp}°C"
result_label.config(text=output_text, fg="green")
else:
result_label.config(text="❌ Error: Could not connect to weather server.", fg="red")
else:
result_label.config(text=f"❌ '{raw_input}' is not a recognized location.", fg="red")
if result:
suggestions_text = "Did you mean:\n" + "\n".join([f"👉 {s}" for s in result])
suggestion_label.config(text=suggestions_text)
else:
suggestion_label.config(text="Please check your spelling and try again.")
# --- 4. THE TKINTER UI LAYOUT ---
# Create primary app window
root = tk.Tk()
root.title("Nigeria Weather Checker")
root.geometry("450x450")
root.resizable(False, False)
# Main container frame
main_frame = ttk.Frame(root, padding="20")
main_frame.pack(fill="both", expand=True)
# Application Heading Label
title_label = tk.Label(main_frame, text="🇳🇬 Nigeria Weather Finder", font=("Arial", 16, "bold"))
title_label.pack(pady=(0, 15))
# Instructions
instruction_label = tk.Label(main_frame, text="Enter a Nigerian State or LGA name:", font=("Arial", 10))
instruction_label.pack(anchor="w")
# User Text Entry Field
location_entry = ttk.Entry(main_frame, font=("Arial", 12), width=35)
location_entry.pack(pady=5, ipady=3)
location_entry.focus() # Place typing cursor in the box automatically
# Submit Button
search_button = ttk.Button(main_frame, text="Get Weather Status", command=check_weather_action)
search_button.pack(pady=10)
# Separator Line
separator = ttk.Separator(main_frame, orient="horizontal")
separator.pack(fill="x", pady=10)
# Display Results box
result_label = tk.Label(main_frame, text="", font=("Arial", 11, "bold"), justify="left")
result_label.pack(pady=5, fill="x")
# Display Spelling Suggestions box
suggestion_label = tk.Label(main_frame, text="", font=("Arial", 10, "italic"), fg="purple", justify="left")
suggestion_label.pack(pady=5)
# Initialize the window loop (Keeps application window open)
root.mainloop()