Skip to content

Commit c607302

Browse files
committed
weather
1 parent b366ed1 commit c607302

File tree

8 files changed

+1224
-1
lines changed

8 files changed

+1224
-1
lines changed

Wheather

Lines changed: 0 additions & 1 deletion
This file was deleted.

Wheather Apk/Simple_gui.py

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import tkinter as tk
2+
from tkinter import ttk
3+
from PIL import Image, ImageTk
4+
import requests
5+
from io import BytesIO
6+
import openai
7+
8+
# ✅ Set your OpenAI API key here
9+
10+
# WeatherAPI key
11+
12+
13+
14+
class WeatherApp:
15+
def __init__(self, root):
16+
self.root = root
17+
self.root.title("🌤️ Weather Monitor + AI Image (India)")
18+
self.root.geometry("900x600")
19+
self.root.resizable(False, False)
20+
21+
# Background
22+
bg_img = Image.open("background.jpg").resize((900, 600))
23+
self.bg_photo = ImageTk.PhotoImage(bg_img)
24+
self.bg_label = tk.Label(root, image=self.bg_photo)
25+
self.bg_label.place(x=0, y=0, relwidth=1, relheight=1)
26+
27+
# Title
28+
self.title = tk.Label(root, text="Weather App (India) + AI Image",
29+
font=("Segoe UI", 20, "bold"), bg="#ffffff", fg="#005f9e")
30+
self.title.place(relx=0.5, y=30, anchor='center')
31+
32+
# City Entry
33+
self.city_entry = ttk.Entry(root, font=("Segoe UI", 12), width=30)
34+
self.city_entry.place(relx=0.32, rely=0.13)
35+
self.city_entry.insert(0, "Enter Indian city")
36+
37+
self.search_btn = ttk.Button(root, text="Check Weather", command=self.get_weather)
38+
self.search_btn.place(relx=0.65, rely=0.13)
39+
40+
# Weather Icon
41+
self.icon_label = tk.Label(root, bg=None)
42+
self.icon_label.place(relx=0.25, rely=0.35, anchor='center')
43+
44+
# Weather Result
45+
self.result_label = tk.Label(root, text="", font=("Segoe UI", 13),
46+
bg="#000080", fg="#ffffff", justify='center', wraplength=500)
47+
self.result_label.place(relx=0.28, rely=0.55, anchor='center')
48+
49+
# AI Image
50+
self.ai_image_label = tk.Label(root, bg="#ffffff", bd=2, relief="solid")
51+
self.ai_image_label.place(relx=0.75, rely=0.5, anchor='center', width=300, height=300)
52+
53+
# Status
54+
self.status = tk.Label(root, text="", font=("Segoe UI", 10), bg="#ffffff", fg="green")
55+
self.status.place(relx=0.5, rely=0.95, anchor='center')
56+
57+
self.loading_label = tk.Label(root, text="", font=("Segoe UI", 10), bg="#ffffff", fg="blue")
58+
self.loading_label.place(relx=0.75, rely=0.85, anchor='center')
59+
60+
def get_weather(self):
61+
city = self.city_entry.get()
62+
if not city.strip():
63+
self.result_label.config(text="❌ Please enter a valid city name.")
64+
self.icon_label.config(image='')
65+
return
66+
67+
params = {
68+
'key': WEATHER_API_KEY,
69+
'q': city,
70+
'aqi': 'no'
71+
}
72+
73+
try:
74+
response = requests.get(BASE_URL, params=params)
75+
data = response.json()
76+
77+
if "error" in data:
78+
self.result_label.config(text=f"❌ Error: {data['error']['message']}")
79+
self.icon_label.config(image='')
80+
return
81+
82+
location = data['location']['name']
83+
country = data['location']['country']
84+
current = data['current']
85+
condition = current['condition']['text']
86+
temp_c = current['temp_c']
87+
feels_like = current['feelslike_c']
88+
humidity = current['humidity']
89+
wind = current['wind_kph']
90+
91+
# Icon
92+
icon_url = "http:" + current['condition']['icon']
93+
icon_data = requests.get(icon_url).content
94+
icon_img = Image.open(BytesIO(icon_data)).resize((64, 64))
95+
self.icon_photo = ImageTk.PhotoImage(icon_img)
96+
self.icon_label.config(image=self.icon_photo)
97+
98+
self.result_label.config(
99+
text=f"📍 {location}, {country}\n"
100+
f"🌡 Temperature: {temp_c}°C (Feels like {feels_like}°C)\n"
101+
f"🌥 Condition: {condition}\n"
102+
f"💧 Humidity: {humidity}%\n"
103+
f"💨 Wind: {wind} km/h"
104+
)
105+
106+
prompt = f"A realistic scenic image showing {condition.lower()} weather in an Indian city"
107+
self.generate_ai_image(prompt)
108+
109+
except Exception as e:
110+
self.result_label.config(text="⚠️ Could not retrieve data.\n" + str(e))
111+
self.icon_label.config(image='')
112+
113+
def generate_ai_image(self, prompt):
114+
try:
115+
self.status.config(text="Generating AI image...")
116+
self.loading_label.config(text="🎨 Creating image...")
117+
118+
response = openai.images.generate(
119+
model="dall-e-3",
120+
prompt=prompt,
121+
n=1,
122+
size="1024x1024"
123+
)
124+
125+
image_url = response.data[0].url
126+
img_data = requests.get(image_url).content
127+
128+
ai_img = Image.open(BytesIO(img_data)).resize((300, 300))
129+
self.ai_photo = ImageTk.PhotoImage(ai_img)
130+
self.ai_image_label.config(image=self.ai_photo)
131+
132+
self.status.config(text="AI image generated.")
133+
self.loading_label.config(text="")
134+
135+
except Exception as e:
136+
self.status.config(text="❌ AI image failed. Check API key or billing.")
137+
self.loading_label.config(text="")
138+
print("AI image generation error:", e)
139+
140+
141+
if __name__ == "__main__":
142+
root = tk.Tk()
143+
app = WeatherApp(root)
144+
root.mainloop()

Wheather Apk/background.jpg

16.4 MB
Loading

Wheather Apk/favorites.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["goa", "shimla", "indore", "Enter Indian city"]

Wheather Apk/main.py

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
import tkinter as tk
2+
from tkinter import ttk, messagebox
3+
import threading
4+
import random
5+
import time
6+
from typing import List, Protocol
7+
8+
class Observer(Protocol):
9+
def update(self, temperature: float, humidity: float, pressure: float):
10+
...
11+
12+
class WeatherStation:
13+
def __init__(self):
14+
self._observers: List[Observer] = []
15+
self._temperature = 25.0
16+
self._humidity = 50.0
17+
self._pressure = 1013.0
18+
19+
def register(self, observer: Observer):
20+
if observer not in self._observers:
21+
self._observers.append(observer)
22+
23+
def unregister(self, observer: Observer):
24+
if observer in self._observers:
25+
self._observers.remove(observer)
26+
27+
def notify(self):
28+
for observer in self._observers:
29+
observer.update(self._temperature, self._humidity, self._pressure)
30+
31+
def set_weather(self, temperature: float, humidity: float, pressure: float):
32+
self._temperature = temperature
33+
self._humidity = humidity
34+
self._pressure = pressure
35+
self.notify()
36+
37+
@property
38+
def weather(self):
39+
return self._temperature, self._humidity, self._pressure
40+
41+
class PhoneDisplay(tk.LabelFrame):
42+
def __init__(self, master, **kwargs):
43+
super().__init__(master, text="Phone Display", padx=10, pady=10, **kwargs)
44+
self.label = tk.Label(self, text="No data", font=("Arial", 12))
45+
self.label.pack()
46+
47+
def update(self, temperature: float, humidity: float, pressure: float):
48+
self.label.config(text=f"Temp: {temperature}°C\nHumidity: {humidity}%\nPressure: {pressure} hPa")
49+
50+
class WindowDisplay(tk.LabelFrame):
51+
def __init__(self, master, **kwargs):
52+
super().__init__(master, text="Window Display", padx=10, pady=10, **kwargs)
53+
self.label = tk.Label(self, text="No data", font=("Arial", 12))
54+
self.label.pack()
55+
56+
def update(self, temperature: float, humidity: float, pressure: float):
57+
self.label.config(text=f"Temp: {temperature}°C\nHumidity: {humidity}%\nPressure: {pressure} hPa")
58+
59+
class WeatherGUI(tk.Tk):
60+
def __init__(self):
61+
super().__init__()
62+
self.title("Weather Monitoring System")
63+
self.geometry("500x400")
64+
self.resizable(False, False)
65+
self.station = WeatherStation()
66+
self.simulation_running = False
67+
self.sim_thread = None
68+
69+
# Observer widgets
70+
self.phone_display = PhoneDisplay(self)
71+
self.window_display = WindowDisplay(self)
72+
self.phone_display.place(x=30, y=120, width=200, height=120)
73+
self.window_display.place(x=270, y=120, width=200, height=120)
74+
75+
# Controls
76+
self.create_controls()
77+
78+
def create_controls(self):
79+
frame = tk.LabelFrame(self, text="Weather Controls", padx=10, pady=10)
80+
frame.place(x=30, y=10, width=440, height=90)
81+
82+
tk.Label(frame, text="Temperature (°C):").grid(row=0, column=0)
83+
tk.Label(frame, text="Humidity (%):").grid(row=0, column=2)
84+
tk.Label(frame, text="Pressure (hPa):").grid(row=0, column=4)
85+
86+
self.temp_var = tk.DoubleVar(value=25)
87+
self.hum_var = tk.DoubleVar(value=50)
88+
self.pres_var = tk.DoubleVar(value=1013)
89+
90+
tk.Entry(frame, textvariable=self.temp_var, width=6).grid(row=0, column=1)
91+
tk.Entry(frame, textvariable=self.hum_var, width=6).grid(row=0, column=3)
92+
tk.Entry(frame, textvariable=self.pres_var, width=8).grid(row=0, column=5)
93+
94+
ttk.Button(frame, text="Update Weather", command=self.update_weather).grid(row=1, column=0, pady=8)
95+
ttk.Button(frame, text="Register Phone", command=self.register_phone).grid(row=1, column=1)
96+
ttk.Button(frame, text="Unregister Phone", command=self.unregister_phone).grid(row=1, column=2)
97+
ttk.Button(frame, text="Register Window", command=self.register_window).grid(row=1, column=3)
98+
ttk.Button(frame, text="Unregister Window", command=self.unregister_window).grid(row=1, column=4)
99+
self.sim_btn = ttk.Button(frame, text="Start Simulation", command=self.toggle_simulation)
100+
self.sim_btn.grid(row=1, column=5)
101+
102+
def update_weather(self):
103+
try:
104+
t = self.temp_var.get()
105+
h = self.hum_var.get()
106+
p = self.pres_var.get()
107+
self.station.set_weather(t, h, p)
108+
except Exception as e:
109+
messagebox.showerror("Error", f"Invalid input: {e}")
110+
111+
def register_phone(self):
112+
self.station.register(self.phone_display)
113+
messagebox.showinfo("Observer", "Phone Display registered.")
114+
115+
def unregister_phone(self):
116+
self.station.unregister(self.phone_display)
117+
messagebox.showinfo("Observer", "Phone Display unregistered.")
118+
119+
def register_window(self):
120+
self.station.register(self.window_display)
121+
messagebox.showinfo("Observer", "Window Display registered.")
122+
123+
def unregister_window(self):
124+
self.station.unregister(self.window_display)
125+
messagebox.showinfo("Observer", "Window Display unregistered.")
126+
127+
def toggle_simulation(self):
128+
if not self.simulation_running:
129+
self.simulation_running = True
130+
self.sim_btn.config(text="Stop Simulation")
131+
self.sim_thread = threading.Thread(target=self.simulate_weather, daemon=True)
132+
self.sim_thread.start()
133+
else:
134+
self.simulation_running = False
135+
self.sim_btn.config(text="Start Simulation")
136+
137+
def simulate_weather(self):
138+
while self.simulation_running:
139+
t = round(random.uniform(15, 35), 1)
140+
h = round(random.uniform(30, 70), 1)
141+
p = round(random.uniform(990, 1030), 1)
142+
self.temp_var.set(t)
143+
self.hum_var.set(h)
144+
self.pres_var.set(p)
145+
self.station.set_weather(t, h, p)
146+
time.sleep(2)
147+
148+
if __name__ == "__main__":
149+
app = WeatherGUI()
150+
app.mainloop()

0 commit comments

Comments
 (0)