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()