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

class WeatherQueryGUI:
    def __init__(self, root):
        # 主窗口基础配置
        self.root = root
        self.root.title("简易天气查询工具")
        self.root.geometry("520x380")
        self.root.resizable(False, False)

        # API基础地址（免费和风天气公开接口）
        self.base_url = "https://devapi.qweather.com/v7/weather/now"
        self.city_search_url = "https://geoapi.qweather.com/v2/city/lookup"
        # 免费测试key，长期使用建议自行去和风天气官网申请免费key
        self.api_key = "a0b21a50113449389f270e663c835f8e"

        self.create_widgets()

    def create_widgets(self):
        # 顶部输入区域
        input_frame = ttk.LabelFrame(self.root, text="城市名称输入")
        input_frame.pack(pady=12, padx=15, fill="x")

        ttk.Label(input_frame, text="城市：").grid(row=0, column=0, padx=8, pady=8)
        self.city_entry = ttk.Entry(input_frame, width=25, font=("微软雅黑", 11))
        self.city_entry.grid(row=0, column=1, padx=5)
        self.city_entry.insert(0, "南京")

        query_btn = ttk.Button(input_frame, text="立即查询天气", command=self.get_weather)
        query_btn.grid(row=0, column=2, padx=10)

        # 结果展示区域
        result_frame = ttk.LabelFrame(self.root, text="实时天气信息")
        result_frame.pack(pady=8, padx=15, fill="both", expand=True)

        # 多行文本框展示天气数据
        self.result_text = tk.Text(result_frame, font=("微软雅黑", 10), wrap="word")
        self.result_text.pack(padx=8, pady=8, fill="both", expand=True)
        self.result_text.config(state="disabled")

    def get_city_id(self, city_name):
        """根据城市名获取城市ID"""
        params = {
            "location": city_name,
            "key": self.api_key
        }
        try:
            resp = requests.get(self.city_search_url, params=params, timeout=8)
            data = resp.json()
            if data.get("code") == "200" and data.get("location"):
                return data["location"][0]["id"]
            else:
                return None
        except Exception:
            return None

    def get_weather(self):
        """核心天气查询逻辑"""
        city_name = self.city_entry.get().strip()
        if not city_name:
            messagebox.showwarning("提示", "请输入需要查询的城市名称！")
            return

        city_id = self.get_city_id(city_name)
        if not city_id:
            messagebox.showerror("错误", "未找到该城市，请检查名称是否正确！")
            return

        # 请求实时天气
        params = {
            "location": city_id,
            "key": self.api_key
        }
        try:
            resp = requests.get(self.base_url, params=params, timeout=10)
            res_data = resp.json()

            if res_data.get("code") != "200":
                messagebox.showerror("接口异常", "天气接口暂时无法获取数据")
                return

            now_data = res_data["now"]
            # 整理展示内容
            show_info = f"""【{city_name} 实时天气】
观测时间：{now_data['obsTime']}
天气状况：{now_data['text']}
实时温度：{now_data['temp']} ℃
体感温度：{now_data['feelsLike']} ℃
风向：{now_data['windDir']}
风力等级：{now_data['windScale']} 级
风速：{now_data['windSpeed']} km/h
空气湿度：{now_data['humidity']} %
大气压强：{now_data['pressure']} hPa
能见度：{now_data['vis']} km"""

            # 写入文本框
            self.result_text.config(state="normal")
            self.result_text.delete(1.0, tk.END)
            self.result_text.insert(tk.END, show_info)
            self.result_text.config(state="disabled")

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

if __name__ == "__main__":
    main_window = tk.Tk()
    app = WeatherQueryGUI(main_window)
    main_window.mainloop()