Files
2025-10-23 13:31:02 +02:00

95 lines
4.0 KiB
Python

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