Advertisement
Chl_Snt

Map Weather App

Jan 4th, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.41 KB | None | 0 0
  1. import requests
  2. from tkinter import Tk, Label, Frame, Button, Entry, Menu, ttk
  3. from tkintermapview import TkinterMapView
  4.  
  5.  
  6. class WeatherApp:
  7.     def __init__(self):
  8.         self.master = Tk()
  9.         self.master.title("Погода на карте")
  10.         self.master.geometry("1000x700")
  11.         self.api_key = "7a42e5228cb6ca39a3fc4aabd2408620"  # Твой API-ключ
  12.  
  13.         # Создаём меню
  14.         self.menu_bar = Menu(self.master)
  15.         self.master.config(menu=self.menu_bar)
  16.  
  17.         self.favorites_menu = Menu(self.menu_bar, tearoff=0)
  18.         self.menu_bar.add_cascade(label="Избранное", menu=self.favorites_menu)
  19.         self.favorites_menu.add_command(label="Очистить избранное",
  20.                                         command=self.clear_favorites)
  21.  
  22.         # Фрейм ввода
  23.         self.top_frame = Frame(self.master, height=100)
  24.         self.top_frame.pack(fill="x", padx=10, pady=5)
  25.  
  26.         Label(self.top_frame, text="Введите адрес:", font=("Arial", 12)).grid(row=0, column=0,
  27.                                                                               padx=5, pady=5, sticky="w")
  28.         self.address_entry = Entry(self.top_frame, font=("Arial", 12), width=30)
  29.         self.address_entry.grid(row=0, column=1, padx=5, pady=5)
  30.  
  31.         self.search_button = Button(self.top_frame, text="Найти",
  32.                                     font=("Arial", 12), command=self.search_address)
  33.         self.search_button.grid(row=0, column=2, padx=5, pady=5)
  34.  
  35.         self.weather_info_label = Label(self.top_frame, text="Выберите место на карте", font=("Arial", 12))
  36.         self.weather_info_label.grid(row=1, column=0, columnspan=3, pady=5)
  37.  
  38.         self.add_favorite_button = Button(self.top_frame, text="Добавить в избранное",
  39.                                           font=("Arial", 12), command=self.add_to_favorites)
  40.         self.add_favorite_button.grid(row=2, column=0, columnspan=3, pady=5)
  41.  
  42.         # Карта
  43.         self.map_widget = TkinterMapView(self.master, width=800, height=500)
  44.         self.lat, self.lon = 55.751244, 37.618423
  45.         self.map_widget.set_position(self.lat, self.lon)  # Москва по умолчанию
  46.         self.map_widget.set_zoom(10)
  47.         self.map_widget.pack(fill="both", expand=True, padx=10, pady=5)
  48.         self.map_widget.add_left_click_map_command(self.on_map_click)
  49.  
  50.         # Избранные города
  51.         self.favorites = {}
  52.  
  53.     def search_address(self):
  54.         city_name = self.address_entry.get()
  55.         if city_name:
  56.             url = f"https://api.openweathermap.org/data/2.5/weather?q={city_name}&units=metric&lang=ru&appid={self.api_key}"
  57.             try:
  58.                 response = requests.get(url)
  59.                 data = response.json()
  60.  
  61.                 # Получаем данные о координатах и погоде
  62.                 self.lat, self.lon = data["coord"]["lat"], data["coord"]["lon"]
  63.                 weather_info = f"{data['name']}: {data['main']['temp']}°C, {data['weather'][0]['description']}"
  64.                 self.weather_info_label.config(text=weather_info)
  65.  
  66.                 # Перемещаем карту на указанные координаты
  67.                 self.map_widget.set_position(self.lat, self.lon)
  68.  
  69.             except requests.exceptions.HTTPError as e:
  70.                 self.weather_info_label.config(text="Город не найден. Попробуй другой.")
  71.             except Exception as e:
  72.                 self.weather_info_label.config(text="Ошибка при обработке данных.")
  73.  
  74.  
  75.     def on_map_click(self, coords):
  76.         self.lat, self.lon = coords
  77.         weather = self.get_weather(self.lat, self.lon)
  78.         if weather:
  79.             self.weather_info_label.config(text=f"{weather['name']}: {weather['temp']}°C, {weather['description']}")
  80.         else:
  81.             self.weather_info_label.config(text="Не удалось получить данные о погоде.")
  82.  
  83.     def get_weather(self, lat, lon):
  84.         url = f"https://api.openweathermap.org/data/2.5/weather?lat={self.lat}&lon={self.lon}&units=metric&lang=ru&appid={self.api_key}"
  85.         try:
  86.             response = requests.get(url)
  87.             data = response.json()
  88.             return {
  89.                 "name": data["name"],
  90.                 "temp": data["main"]["temp"],
  91.                 "description": data["weather"][0]["description"]
  92.             }
  93.         except Exception as e:
  94.             print(f"Ошибка при получении данных о погоде: {e}")
  95.             return None
  96.  
  97.     def add_to_favorites(self):
  98.         current_city = self.weather_info_label.cget("text")
  99.         if "Выберите место" not in current_city:
  100.             self.favorites[current_city] = (float(self.lat), float(self.lon))
  101.             self.favorites_menu.add_command(label=current_city,
  102.                                             command=lambda: self.show_favorite(current_city))
  103.  
  104.     def show_favorite(self, favorite):
  105.         self.weather_info_label.config(text=favorite)
  106.         self.map_widget.set_position(*self.favorites[favorite])
  107.  
  108.     def clear_favorites(self):
  109.         self.favorites = {}
  110.         self.favorites_menu.delete(0, "end")
  111.  
  112.     def run(self):
  113.         self.master.mainloop()
  114.  
  115.  
  116.  
  117. if __name__ == "__main__":
  118.     app = WeatherApp()
  119.     app.run()
  120.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement