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

# ===================== 配置项（自行替换KEY）=====================
# 去和风天气官网注册免费个人key：https://dev.qweather.com/
HEFENG_KEY = "填写你自己的和风KEY"
API_URL = "https://devapi.qweather.com/v7/weather/now"
CITY_LOOKUP_URL = "https://geoapi.qweather.com/v2/city/lookup"
# ==============================================================

class WeatherQueryApp:
    def __init__(self, root):
        self.root = root
        self.root.title("简易天气查询工具")
        self.root.geometry("480x380")
        self.root.resizable(False, False)
        self.root.config(bg="#f5f7fa")

        self.create_widgets()

    def create_widgets(self):
        # 顶部标题
        title_label = tk.Label(
            self.root, text="☀️ 实时天气查询",
            font=("微软雅黑", 16, "bold"), bg="#f5f7fa", fg="#222222"
        )
        title_label.pack(pady=15)

        # 城市输入区域
        frame_input = tk.Frame(self.root, bg="#f5f7fa")
        frame_input.pack()
        tk.Label(frame_input, text="输入城市名称：", font=("微软雅黑", 11), bg="#f5f7fa").grid(row=0, column=0, padx=5)
        self.city_var = tk.StringVar()
        city_entry = ttk.Entry(frame_input, textvariable=self.city_var, width=20, font=("微软雅黑", 11))
        city_entry.grid(row=0, column=1, padx=8)
        city_entry.focus()

        # 查询按钮
        query_btn = tk.Button(
            self.root, text="查询天气", command=self.get_weather,
            bg="#2196F3", fg="white", font=("微软雅黑", 10), relief="flat", padx=15
        )
        query_btn.pack(pady=10)

        # 结果展示框
        result_frame = tk.LabelFrame(self.root, text="天气信息", font=("微软雅黑", 11), bg="white")
        result_frame.pack(fill="x", padx=30, pady=5, ipady=8)

        self.result_text = tk.Text(
            result_frame, height=10, width=52,
            font=("微软雅黑", 10), bg="#f8fafc"
        )
        self.result_text.pack(padx=8)

        # 清空按钮
        clear_btn = tk.Button(
            self.root, text="清空", command=self.clear_data,
            bg="#f44336", fg="white", font=("微软雅黑", 10), relief="flat"
        )
        clear_btn.pack(pady=8)

    # 根据城市名获取城市ID
    def get_city_id(self, city_name):
        params = {
            "location": city_name,
            "key": HEFENG_KEY
        }
        resp = requests.get(CITY_LOOKUP_URL, params=params, timeout=8)
        data = resp.json()
        if data["code"] != "200":
            return None
        city_id = data["location"][0]["id"]
        return city_id

    # 获取实时天气数据
    def get_weather(self):
        city_name = self.city_var.get().strip()
        if not city_name:
            messagebox.showwarning("提示", "请输入城市名称！例如：北京、上海、盐城")
            return

        if HEFENG_KEY == "填写你自己的和风KEY":
            messagebox.showerror("错误", "请先填写代码上方的和风天气KEY！")
            return

        try:
            city_id = self.get_city_id(city_name)
            if city_id is None:
                messagebox.showerror("错误", "找不到该城市，请检查名称")
                return

            # 请求实时天气
            params = {
                "location": city_id,
                "key": HEFENG_KEY
            }
            res = requests.get(API_URL, params=params, timeout=10)
            weather_data = res.json()

            if weather_data["code"] != "200":
                messagebox.showerror("获取失败", f"接口错误 code:{weather_data['code']}")
                return

            now = weather_data["now"]
            temp = now["temp"]            # 实际温度
            feels_temp = now["feelsLike"] # 体感温度
            weather_text = now["text"]    # 天气状况
            humidity = now["humidity"]    # 湿度
            wind_dir = now["windDir"]     # 风向
            wind_scale = now["windScale"] # 风力等级
            obs_time = now["obsTime"]     # 观测时间

            # 拼接展示文本
            self.result_text.delete(1.0, tk.END)
            show_info = (
                f"📍 查询城市：{city_name}\n"
                f"⏰ 观测时间：{obs_time}\n"
                f"🌤 天气状况：{weather_text}\n"
                f"🌡 实时温度：{temp} ℃\n"
                f"🌡 体感温度：{feels_temp} ℃\n"
                f"💧 空气湿度：{humidity} %\n"
                f"💨 风向风力：{wind_dir} {wind_scale}级"
            )
            self.result_text.insert(tk.END, show_info)

        except requests.exceptions.Timeout:
            messagebox.showerror("网络错误", "请求超时，请检查网络连接")
        except Exception as e:
            messagebox.showerror("异常", f"程序出错：{str(e)}")

    # 清空输入和结果
    def clear_data(self):
        self.city_var.set("")
        self.result_text.delete(1.0, tk.END)

if __name__ == "__main__":
    win = tk.Tk()
    app = WeatherQueryApp(win)
    win.mainloop()