Add main.py
This commit is contained in:
		
							
								
								
									
										95
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							@@ -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()
 | 
			
		||||
		Reference in New Issue
	
	Block a user