# 用Python Tkinter开发本地城市天气查询桌面应用


背景介绍

在日常开发中,桌面应用是提升用户体验的重要载体。本文将带你使用Python的Tkinter库开发一个本地城市天气查询应用,结合JSON数据处理、模糊查询和个性化建议生成,帮助你掌握桌面应用开发的核心技能(GUI交互、文件IO、字符串匹配、条件逻辑)。通过这个项目,你将学会如何从本地JSON文件读取数据、实现模糊搜索、根据条件生成生活建议,并通过Tkinter构建直观的交互界面。

实现思路分析

我们的应用需要完成以下核心任务:
1. GUI界面设计:使用Tkinter创建包含“输入框+查询按钮+结果展示”的交互界面。
2. 数据加载:启动时读取本地city_weather.json文件,解析为Python字典列表。
3. 模糊查询:通过字符串包含关系(输入内容是否在城市名中)实现模糊搜索。
4. 建议生成:根据温度范围(如>30℃高温、<10℃低温)和天气类型(雨、晴、阴等)生成个性化生活建议。
5. 结果展示:匹配到城市则显示天气信息+建议,否则提示“未找到”。

代码实现(Python + Tkinter)

下面是完整的代码实现,包含详细注释:

import tkinter as tk
import json

def load_weather_data():
    """加载本地JSON天气数据"""
    try:
        with open('city_weather.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
        return data
    except FileNotFoundError:
        print("错误:天气数据文件 city_weather.json 不存在!")
        return []
    except json.JSONDecodeError:
        print("错误:天气数据文件格式无效!")
        return []

def generate_suggestion(temperature, weather):
    """根据温度和天气类型生成生活建议"""
    suggestion = ""
    # 温度维度建议
    if temperature > 30:
        suggestion += "今日气温较高,建议穿短袖、短裤等清凉透气的衣物;"
    elif temperature < 10:
        suggestion += "今日气温较低,建议穿羽绒服、毛衣+外套等保暖衣物;"
    else:
        suggestion += "今日气温适中,建议穿长袖衬衫、薄外套等舒适衣物;"
    # 天气维度建议
    if "雨" in weather:
        suggestion += "天气有雨,建议携带雨伞,雨天路滑请注意出行安全;"
    elif "晴" in weather:
        suggestion += "天气晴朗,紫外线较强,建议做好防晒措施(如戴帽子、涂防晒霜);"
    elif "阴" in weather:
        suggestion += "天气阴沉,体感舒适,可正常安排出行;"
    elif "雷阵雨" in weather:
        suggestion += "天气为雷阵雨,建议避免户外活动,远离雷电区域;"
    elif "多云" in weather:
        suggestion += "天气多云,可根据实际体感调整衣物,出行较为舒适;"
    return suggestion

def main():
    # 1. 加载天气数据
    weather_data = load_weather_data()
    if not weather_data:
        print("数据加载失败,应用退出!")
        return

    # 2. 创建主窗口
    root = tk.Tk()
    root.title("城市天气查询")
    root.geometry("500x300")  # 窗口大小:宽500,高300
    root.resizable(False, False)  # 禁止窗口缩放

    # 3. 界面组件布局(使用pack布局)
    # 城市输入标签
    city_label = tk.Label(root, text="请输入城市名称(支持模糊查询):", font=("微软雅黑", 10))
    city_label.pack(pady=10)

    # 城市输入框
    entry = tk.Entry(root, width=30, font=("微软雅黑", 10))
    entry.pack(pady=5)

    # 查询按钮(绑定查询逻辑)
    def query_weather():
        city_input = entry.get().strip()
        if not city_input:
            result_label.config(text="请输入城市名称!")
            return

        # 模糊查询:遍历数据,匹配包含输入内容的城市
        matched_city = None
        for city in weather_data:
            if city_input in city['city']:  # 输入内容是城市名的子串(模糊匹配)
                matched_city = city
                break  # 找到第一个匹配的城市

        if matched_city:
            # 提取天气信息
            city_name = matched_city['city']
            temperature = matched_city['temperature']
            temp_unit = matched_city['temp_unit']
            weather = matched_city['weather']
            # 生成建议
            suggestion = generate_suggestion(temperature, weather)
            # 拼接结果文本
            result_text = (f"城市:{city_name}\n"
                           f"温度:{temperature}{temp_unit}\n"
                           f"天气:{weather}\n"
                           f"建议:{suggestion}")
            result_label.config(text=result_text)
        else:
            result_label.config(text="未找到该城市的天气数据,请检查输入是否正确。")

    query_btn = tk.Button(
        root, 
        text="查询", 
        command=query_weather, 
        font=("微软雅黑", 10), 
        width=10
    )
    query_btn.pack(pady=10)

    # 结果展示标签(支持自动换行)
    result_label = tk.Label(
        root, 
        text="查询结果将显示在这里...", 
        font=("微软雅黑", 10), 
        wraplength=450,  # 换行宽度
        justify="left"   # 左对齐
    )
    result_label.pack(pady=10)

    # 4. 启动主循环
    root.mainloop()

if __name__ == "__main__":
    main()

代码核心逻辑解析

  1. 数据加载load_weather_data函数通过json.load读取本地JSON文件,处理文件不存在或格式错误的异常。
  2. 模糊查询:通过if city_input in city['city']实现“输入内容是城市名的子串”的模糊匹配(如输入“北”可匹配“北京”)。
  3. 建议生成generate_suggestion函数通过温度范围(>30℃/ <10℃/ 中间)和天气类型(雨/晴/阴/雷阵雨/多云)的条件判断,生成个性化生活建议。
  4. 界面交互:通过Tkinter的EntryButtonLabel组件实现输入、查询、结果展示,按钮点击时触发query_weather函数处理逻辑。

运行与测试

  1. 准备数据文件:在代码同级目录下创建city_weather.json,内容如下(可根据需求扩展):
    json
    [
    {"city": "北京", "temperature": 25, "weather": "多云", "temp_unit": "℃"},
    {"city": "上海", "temperature": 28, "weather": "晴转多云", "temp_unit": "℃"},
    {"city": "广州", "temperature": 30, "weather": "雷阵雨", "temp_unit": "℃"},
    {"city": "成都", "temperature": 22, "weather": "阴", "temp_unit": "℃"}
    ]
  2. 运行代码:执行Python脚本,输入城市名(如“上海”“北”),点击“查询”查看结果。
  3. 测试场景
    • 输入“上海”:应显示温度28℃、晴转多云,建议包含“高温少穿+晴天防晒”。
    • 输入“未知城市”:提示“未找到该城市的天气数据”。

总结与扩展

通过这个项目,你掌握了Tkinter GUI开发JSON文件处理模糊查询算法条件逻辑建议生成的核心技能。未来可扩展方向:
数据扩展:增加更多城市天气数据,或从网络API实时获取天气。
界面美化:使用ttk主题、自定义颜色/字体,或添加天气图标。
功能增强:支持多条件查询(如按温度范围、天气类型筛选),或添加历史查询记录。

这篇博客通过一个实用的天气查询应用,带你从0到1掌握Python桌面开发的核心技术。如果你在实践中遇到问题,欢迎留言讨论!

(注:代码中city_weather.json需与Python脚本同级目录,或修改load_weather_data的文件路径。)