import tkinter as tk
from tkinter import ttk, messagebox
import requests

class WeatherApp:
    def __init__(self, root):
        self.root = root
        self.root.title("天气查询小程序")
        self.root.geometry("520x400")
        self.root.resizable(False, False)
        self.root.configure(bg="#E6F2FF")

        # 字体设置（微软雅黑，解决中文乱码）
        self.font_title = ("微软雅黑", 16, "bold")
        self.font_text = ("微软雅黑", 11)

        self.build_ui()

    def build_ui(self):
        # 标题
        title_label = tk.Label(
            self.root,
            text="🌤️ 天气查询工具",
            font=self.font_title,
            bg="#E6F2FF",
            fg="#0056A6"
        )
        title_label.pack(pady=16)

        # 输入区域框架
        frame_input = tk.Frame(self.root, bg="#E6F2FF")
        frame_input.pack(pady=6)

        tk.Label(
            frame_input,
            text="城市名称：",
            font=self.font_text,
            bg="#E6F2FF"
        ).grid(row=0, column=0, padx=5)

        self.city_entry = ttk.Entry(frame_input, width=22, font=self.font_text)
        self.city_entry.grid(row=0, column=1, padx=6)
        self.city_entry.insert(0, "盐城")  # 默认城市
        self.city_entry.bind("<Return>", self.query_weather)

        search_btn = ttk.Button(
            frame_input,
            text="查询天气",
            command=self.query_weather
        )
        search_btn.grid(row=0, column=2, padx=6)

        # 结果展示框
        frame_result = tk.LabelFrame(
            self.root,
            text="天气信息",
            font=self.font_text,
            bg="#E6F2FF"
        )
        frame_result.pack(pady=15, padx=20, fill="both", expand=True)

        self.result_text = tk.Text(
            frame_result,
            font=self.font_text,
            height=10,
            bg="#F5FAFF"
        )
        self.result_text.pack(padx=10, pady=10, fill="both")
        self.result_text.config(state="disabled")

    def query_weather(self, event=None):
        city = self.city_entry.get().strip()
        if not city:
            messagebox.showwarning("提示", "请输入城市名称！")
            return

        try:
            # 使用地理编码API获取城市经纬度
            geo_url = f"https://geocoding-api.open-meteo.com/v1/search?name={city}&count=1&language=zh"
            geo_resp = requests.get(geo_url, timeout=8)
            geo_data = geo_resp.json()

            if "results" not in geo_data or len(geo_data["results"]) == 0:
                self.show_text(f"未找到城市：{city}\n请检查城市名称！")
                return

            lat = geo_data["results"][0]["latitude"]
            lon = geo_data["results"][0]["longitude"]
            city_name = geo_data["results"][0]["name"]

            # 获取气象数据
            weather_url = (
                f"https://api.open-meteo.com/v1/forecast"
                f"?latitude={lat}&longitude={lon}"
                f"&current_weather=true"
                f"&daily=temperature_2m_max,temperature_2m_min"
                f"&timezone=auto"
            )
            weather_resp = requests.get(weather_url, timeout=8)
            w_data = weather_resp.json()
            curr = w_data["current_weather"]
            daily = w_data["daily"]

            temp = curr["temperature"]
            wind_speed = curr["windspeed"]
            wind_dir = curr["winddirection"]
            weather_code = curr["weathercode"]

            # 天气代码转中文描述
            weather_map = {
                0: "晴",
                1: "大部晴", 2: "多云", 3: "阴天",
                45: "雾", 48: "雾凇",
                51: "小雨", 53: "中雨", 55: "大雨",
                61: "雨", 71: "小雪",
                80: "阵雨", 95: "雷阵雨"
            }
            weather_desc = weather_map.get(weather_code, "未知天气")

            max_temp = daily["temperature_2m_max"][0]
            min_temp = daily["temperature_2m_min"][0]

            info = (
                f"📍城市：{city_name}\n"
                f"🌤天气状况：{weather_desc}\n"
                f"🌡当前温度：{temp} ℃\n"
                f"📌今日最高温：{max_temp} ℃\n"
                f"📌今日最低温：{min_temp} ℃\n"
                f"💨风速：{wind_speed} km/h\n"
                f"🧭风向角度：{wind_dir}°\n\n"
                "数据来源：Open-Meteo 开源气象接口"
            )
            self.show_text(info)

        except requests.exceptions.Timeout:
            self.show_text("网络超时，请检查网络连接！")
        except Exception as e:
            self.show_text(f"查询失败：{str(e)}")

    def show_text(self, msg):
        self.result_text.config(state="normal")
        self.result_text.delete(1.0, tk.END)
        self.result_text.insert(tk.END, msg)
        self.result_text.config(state="disabled")

if __name__ == "__main__":
    root = tk.Tk()
    app = WeatherApp(root)
    root.mainloop()