commit 1cf15b5e678d9426cb805425744f31886ee88c0a Author: elias Date: Thu Oct 23 13:31:02 2025 +0200 Add main.py diff --git a/main.py b/main.py new file mode 100644 index 0000000..15ceb59 --- /dev/null +++ b/main.py @@ -0,0 +1,95 @@ +import aiohttp, asyncio, io +import customtkinter as tk +from PIL import Image +from datetime import datetime, timedelta, timezone + +API_KEY_TOP_SECRET_DO_NOT_LEAK = "75b4074e2a7743ef8c9121626252110" + +async def fetch_weather(q): + async with aiohttp.ClientSession() as session: + async with session.get(f"https://api.weatherapi.com/v1/current.json?key={API_KEY_TOP_SECRET_DO_NOT_LEAK}&q={q}") as response: + data = await response.json() + return data + +class App(tk.CTk): + def __init__(self): + super().__init__() + self.geometry("600x400") + self.resizable(False, False) + + self.input = tk.CTkEntry(self, placeholder_text="location") + self.button = tk.CTkButton(self, text="get wetha", command=self.button_callbck) + self.input.pack(padx=0, pady=20) + self.button.pack(padx=20, pady=0) + + top_frame = tk.CTkFrame(self, fg_color="transparent") + top_frame.pack(pady=20) + + self.location = tk.CTkLabel(top_frame, text="", fg_color="transparent", width=150, justify="center") + self.region = tk.CTkLabel(top_frame, text="", fg_color="transparent", width=150, justify="center") + self.country = tk.CTkLabel(top_frame, text="", fg_color="transparent", width=150, justify="center") + + self.location.pack(side="left", padx=20) + self.region.pack(side="left", padx=20) + self.country.pack(side="left", padx=20) + + bottom_frame = tk.CTkFrame(self, fg_color="transparent") + bottom_frame.pack(pady=5) + + self.state = tk.CTkLabel(bottom_frame, text="", fg_color="transparent", width=150, justify="center") + self.temp = tk.CTkLabel(bottom_frame, text="", fg_color="transparent", width=150, justify="center") + + self.state.pack(side="left", padx=20) + self.temp.pack(side="left", padx=20) + + self.icon_frame = tk.CTkFrame(self, fg_color="transparent") + self.icon_frame.pack(pady=10) + + self.icon_label = tk.CTkLabel(self.icon_frame, text="") + self.icon_label.pack() + + self.updated_frame = tk.CTkFrame(self, fg_color="transparent") + self.updated_frame.pack(pady=45) + + self.last_updated = tk.CTkLabel(self.updated_frame, text="") + self.last_updated.pack() + + def button_callbck(self): + data = asyncio.run(fetch_weather(self.input.get())) + + location = data.get('location', {}).get('name') + region = data.get('location', {}).get('region') + country = data.get('location', {}).get('country') + state = data.get('current', {}).get('condition', {}).get('text') + icon_url = "https:" + data.get('current', {}).get('condition', {}).get('icon', '') + temp = data.get('current', {}).get('temp_c') + last_updated = data.get('current', {}).get('last_updated_epoch') + + self.location.configure(text=f"Location: {location}") + self.region.configure(text=f"Region: {region}") + self.country.configure(text=f"Country: {country}") + self.state.configure(text=f"Weather: {state}") + self.temp.configure(text=f"Temp: {temp}°C") + self.last_updated.configure(text=f"Last Updated: {datetime.fromtimestamp(last_updated, tz=timezone(timedelta(hours=2))).strftime("%d.%m.%Y %H:%M:%S %Z")}") + + asyncio.run(self.load_icon(icon_url)) + + async def load_icon(self, url): + try: + async with aiohttp.ClientSession() as session: + async with session.get(url) as response: + response.raise_for_status() + img_data = await response.read() + pil_image = Image.open(io.BytesIO(img_data)).resize((64, 64)) + ctk_image = tk.CTkImage(light_image=pil_image, dark_image=pil_image, size=(64, 64)) + + self.icon_label.configure(image=ctk_image, text="") + self.icon_label.image = ctk_image + except Exception: + self.icon_label.configure(image=None, text="Icon N/A") + + tk.set_appearance_mode("dark") + tk.set_default_color_theme("dark-blue") + +app = App() +app.mainloop() \ No newline at end of file