Mobil Menü

Python ile Hava Durumu Uygulaması

Python programlama dili, kullanıcı dostu uygulamalar geliştirmek için oldukça popüler bir seçenektir. Bu yazıda, Python ile gelişmiş bir hava durumu uygulaması nasıl oluşturabileceğinizi adım adım anlatıyoruz. Bu uygulama, kullanıcıların girdiği şehir adına göre anlık hava durumu bilgilerini, 5 günlük hava tahminini, hava kalitesi indeksini (AQI) ve UV indeksini detaylı bir şekilde gösterir. Ayrıca, kullanıcının konumunu otomatik olarak algılayarak daha kişiselleştirilmiş bir deneyim sunar.

Uygulamanın Öne Çıkan Özellikleri

  1. Konum Algılama (Geolocation):
    • Kullanıcının girdiği şehir adına göre enlem ve boylam bilgilerini alır.
    • geopy kütüphanesi ile şehir adını koordinatlara dönüştürür.
    • Bu sayede, hava durumu bilgileri tam olarak kullanıcının istediği bölgeye göre gösterilir.
  2. Anlık Hava Durumu Bilgileri:
    • Sıcaklık, hissedilen sıcaklık, nem oranı, rüzgar hızı ve yönü, atmosferik basınç, güneş doğuşu ve batışı zamanları gibi detaylı bilgiler sunar.
    • OpenWeatherMap API’si kullanılarak gerçek zamanlı veriler çekilir.
  3. 5 Günlük Hava Tahmini:
    • Her gün için sıcaklık, hava durumu açıklaması ve ikonlar ile 5 günlük tahmin bilgileri gösterilir.
    • Bu özellik, kullanıcıların gelecekteki hava koşullarını planlamalarına yardımcı olur.
  4. Hava Kalitesi İndeksi (AQI) ve UV İndeksi:
    • Hava kalitesi indeksi (AQI), havanın ne kadar temiz veya kirli olduğunu gösterir.
    • UV indeksi, güneş ışınlarının zararlı etkilerine karşı uyarı sağlar.
    • Bu bilgiler, özellikle sağlık açısından önemli bir rehberdir.
  5. Grafiksel Arayüz (GUI):
    • Tkinter kütüphanesi kullanılarak kullanıcı dostu bir grafiksel arayüz oluşturulmuştur.
    • Kullanıcılar, şehir adını girerek tüm bilgilere kolayca erişebilir.
    • Arayüzde renkli çıktılar ve ikonlar kullanılarak daha çekici bir tasarım sunulmuştur.

Uygulamanın Çalışma Mantığı

Uygulama, kullanıcının girdiği şehir adını alarak OpenWeatherMap API’sine istek gönderir. API’den gelen veriler işlenerek anlık hava durumu bilgileri, 5 günlük tahmin, hava kalitesi ve UV indeksi gibi detaylar kullanıcıya sunulur. Ayrıca, geopy kütüphanesi ile şehir adı koordinatlara dönüştürülerek doğru konum bilgisi elde edilir.

Neden Bu Uygulamayı Kullanmalısınız?

  • Kullanım Kolaylığı: Basit ve anlaşılır arayüzü sayesinde herkes kolayca kullanabilir.
  • Detaylı Bilgiler: Sadece sıcaklık değil, rüzgar, nem, basınç, hava kalitesi gibi birçok detayı bir arada sunar.
  • Gelecek Tahminleri: 5 günlük hava tahmini ile planlarınızı önceden yapabilirsiniz.
  • Ücretsiz ve Açık Kaynak: Python ve OpenWeatherMap API’si ücretsizdir. Kodlar tamamen açık kaynaklıdır, istediğiniz gibi özelleştirebilirsiniz.

Sonuç

Python ile geliştirilen bu hava durumu uygulaması, hem yeni başlayanlar hem de deneyimli geliştiriciler için harika bir proje örneğidir. Uygulama, kullanıcıların hava durumu bilgilerine kolayca erişmelerini sağlarken, Python’un gücünü ve esnekliğini de gösterir. Bu projeyi geliştirerek kendi portföyünüze ekleyebilir veya günlük hayatta kullanabilirsiniz.

import requests
from datetime import datetime
import tkinter as tk
from tkinter import ttk, messagebox
from geopy.geocoders import Nominatim
from timezonefinder import TimezoneFinder
from PIL import Image, ImageTk
import io

# OpenWeatherMap API anahtarınızı buraya girin
API_KEY = 'sizin_api_anahtarınız'
BASE_URL_CURRENT = 'http://api.openweathermap.org/data/2.5/weather'
BASE_URL_FORECAST = 'http://api.openweathermap.org/data/2.5/forecast'
BASE_URL_AIR_POLLUTION = 'http://api.openweathermap.org/data/2.5/air_pollution'
BASE_URL_UV = 'http://api.openweathermap.org/data/2.5/uvi'

# Hava durumu ikonları
WEATHER_ICONS = {
    'clear': '☀️',
    'clouds': '☁️',
    'rain': '🌧️',
    'thunderstorm': '⛈️',
    'snow': '❄️',
    'mist': '🌫️',
    'drizzle': '🌦️'
}

def hava_durumu_ikonu_al(durum):
    """Hava durumu durumuna göre ikon döndürür."""
    durum = durum.lower()
    for key, icon in WEATHER_ICONS.items():
        if key in durum:
            return icon
    return '🌍'

def konum_al():
    """Kullanıcının konumunu alır."""
    try:
        geolocator = Nominatim(user_agent="hava_durumu_uygulamasi")
        location = geolocator.geocode(sehir_giris.get())
        if location:
            return location.latitude, location.longitude
        else:
            messagebox.showwarning("Uyarı", "Konum bulunamadı. Lütfen geçerli bir şehir adı girin.")
            return None, None
    except Exception as e:
        messagebox.showerror("Hata", f"Konum alınırken hata oluştu: {e}")
        return None, None

def hava_durumu_bilgisi_al(lat, lon):
    """Mevcut hava durumu bilgilerini alır."""
    params = {
        'lat': lat,
        'lon': lon,
        'appid': API_KEY,
        'units': 'metric',
        'lang': 'tr'
    }

    try:
        response = requests.get(BASE_URL_CURRENT, params=params)
        response.raise_for_status()
        hava_durumu = response.json()

        # Hava durumu bilgilerini işle
        sehir_adi = hava_durumu['name']
        sicaklik = hava_durumu['main']['temp']
        hissedilen = hava_durumu['main']['feels_like']
        nem = hava_durumu['main']['humidity']
        basinc = hava_durumu['main']['pressure']
        ruzgar_hizi = hava_durumu['wind']['speed']
        ruzgar_yonu = hava_durumu['wind'].get('deg', 'Bilinmiyor')
        durum = hava_durumu['weather'][0]['description']
        gunes_dogusu = datetime.fromtimestamp(hava_durumu['sys']['sunrise']).strftime('%H:%M')
        gunes_batisi = datetime.fromtimestamp(hava_durumu['sys']['sunset']).strftime('%H:%M')
        ikon = hava_durumu_ikonu_al(hava_durumu['weather'][0]['main'])

        # Bilgileri ekrana yazdır
        bilgiler = (
            f"{ikon} {sehir_adi.capitalize()} için Hava Durumu Bilgileri:\n"
            f"📍 Sıcaklık: {sicaklik}°C (Hissedilen: {hissedilen}°C)\n"
            f"💧 Nem: {nem}%\n"
            f"🌬️ Rüzgar Hızı: {ruzgar_hizi} m/s, Yön: {ruzgar_yonu}°\n"
            f"📊 Atmosferik Basınç: {basinc} hPa\n"
            f"🌅 Güneş Doğuşu: {gunes_dogusu}\n"
            f"🌇 Güneş Batışı: {gunes_batisi}\n"
            f"🌈 Hava Durumu: {durum.capitalize()}"
        )

        # Hava kalitesi bilgilerini al
        aqi = hava_kalitesi_bilgisi_al(lat, lon)
        bilgiler += f"\n🌍 Hava Kalitesi İndeksi (AQI): {aqi}"

        # UV indeksini al
        uv = uv_indeksi_al(lat, lon)
        bilgiler += f"\n☀️ UV İndeksi: {uv}"

        return bilgiler

    except requests.exceptions.HTTPError as http_err:
        messagebox.showerror("Hata", f"HTTP hatası oluştu: {http_err}")
    except Exception as err:
        messagebox.showerror("Hata", f"Beklenmeyen bir hata oluştu: {err}")

def hava_kalitesi_bilgisi_al(lat, lon):
    """Hava kalitesi bilgilerini alır."""
    params = {
        'lat': lat,
        'lon': lon,
        'appid': API_KEY
    }

    try:
        response = requests.get(BASE_URL_AIR_POLLUTION, params=params)
        response.raise_for_status()
        hava_kalitesi = response.json()
        return hava_kalitesi['list'][0]['main']['aqi']
    except:
        return "Bilinmiyor"

def uv_indeksi_al(lat, lon):
    """UV indeksini alır."""
    params = {
        'lat': lat,
        'lon': lon,
        'appid': API_KEY
    }

    try:
        response = requests.get(BASE_URL_UV, params=params)
        response.raise_for_status()
        uv_indeksi = response.json()
        return uv_indeksi['value']
    except:
        return "Bilinmiyor"

def hava_durumu_tahmini_al(lat, lon):
    """5 günlük hava durumu tahminini alır."""
    params = {
        'lat': lat,
        'lon': lon,
        'appid': API_KEY,
        'units': 'metric',
        'lang': 'tr'
    }

    try:
        response = requests.get(BASE_URL_FORECAST, params=params)
        response.raise_for_status()
        tahmin = response.json()

        tahmin_bilgileri = f"5 Günlük Hava Durumu Tahmini:\n"
        for i, entry in enumerate(tahmin['list']):
            if i % 8 == 0:  # Her gün için bir tahmin göster (API her 3 saatte bir veri sağlar)
                tarih = datetime.fromtimestamp(entry['dt']).strftime('%d.%m.%Y %H:%M')
                sicaklik = entry['main']['temp']
                durum = entry['weather'][0]['description']
                ikon = hava_durumu_ikonu_al(entry['weather'][0]['main'])
                tahmin_bilgileri += f"📅 {tarih}: {ikon} {sicaklik}°C, {durum.capitalize()}\n"

        return tahmin_bilgileri

    except requests.exceptions.HTTPError as http_err:
        messagebox.showerror("Hata", f"HTTP hatası oluştu: {http_err}")
    except Exception as err:
        messagebox.showerror("Hata", f"Beklenmeyen bir hata oluştu: {err}")

def bilgileri_goster():
    """Hava durumu bilgilerini gösterir."""
    sehir = sehir_giris.get()
    if sehir:
        lat, lon = konum_al()
        if lat and lon:
            bilgiler = hava_durumu_bilgisi_al(lat, lon)
            tahmin = hava_durumu_tahmini_al(lat, lon)
            if bilgiler and tahmin:
                sonuc_metni.config(state=tk.NORMAL)
                sonuc_metni.delete(1.0, tk.END)
                sonuc_metni.insert(tk.END, bilgiler + "\n\n" + tahmin)
                sonuc_metni.config(state=tk.DISABLED)
    else:
        messagebox.showwarning("Uyarı", "Lütfen bir şehir adı girin.")

# Tkinter GUI oluşturma
root = tk.Tk()
root.title("Hava Durumu Uygulaması")
root.geometry("600x500")

# Arka plan rengi
root.configure(bg="#f0f0f0")

# Şehir giriş alanı
sehir_giris = ttk.Entry(root, width=30, font=("Arial", 12))
sehir_giris.pack(pady=10)

# Bilgileri göster butonu
goster_butonu = ttk.Button(root, text="Hava Durumu Bilgilerini Göster", command=bilgileri_goster)
goster_butonu.pack(pady=5)

# Sonuç metin alanı
sonuc_metni = tk.Text(root, wrap=tk.WORD, state=tk.DISABLED, height=20, width=60, font=("Arial", 10))
sonuc_metni.pack(pady=10)

# Uygulamayı başlat
root.mainloop()
Osman Bayrak
Osman Bayrak

Yazılım Mühendisiyim. Teknoloji ve yazılıma meraklıyım.

Articles: 154