工具介紹
- 這個天氣查詢工具是一個基于 Python 的桌面應用程序,使用了tkinter庫來創建圖形用戶界面(GUI),并通過requests庫調用 Open - Meteo API 獲取天氣數據。它具有賽博朋克風格的界面設計,提供了當前天氣信息、15 天天氣預報以及詳細的天氣數據展示,同時還包含溫度趨勢圖表。
工具使用說明
界面布局
- 頂部標題欄:顯示應用名稱 “賽博朋克風格天氣查詢”。
搜索區域:
- 輸入框:可以輸入要查詢的城市名稱,默認顯示為 “北京”。
- 查詢按鈕:點擊該按鈕可以查詢輸入城市的天氣信息。
標簽頁:
- 當前天氣:顯示當前城市的天氣信息,包括城市名稱、日期、天氣狀況、溫度、體感溫度以及一些基本的天氣數據(如濕度、風速等)。
- 15 天預報:包含未來 15 天的溫度趨勢圖表和每天的天氣預報卡片,卡片顯示日期、星期、天氣狀況、最高溫度和最低溫度。
- 詳細信息:顯示更詳細的天氣數據,如日出時間、日落時間、日照時長、風向等。
查詢天氣
- 在輸入框中輸入要查詢的城市名稱。
- 點擊 “查詢天氣” 按鈕。
- 應用會顯示加載中指示器,同時在后臺線程中獲取天氣數據。
- 獲取數據成功后,更新各個標簽頁的內容,顯示該城市的天氣信息;如果獲取數據失敗,會彈出錯誤提示框。
功能特點
- 多信息展示:提供當前天氣、15 天預報和詳細天氣信息,滿足用戶對不同時間尺度天氣數據的需求。
- 圖表可視化:通過matplotlib庫繪制未來 15 天的溫度趨勢圖表,直觀展示溫度變化。
- 賽博朋克風格:使用賽博朋克風格的顏色和字體,界面設計獨特。
- 多線程處理:在新線程中獲取天氣數據,避免阻塞 UI,保證用戶交互的流暢性。
- 錯誤處理:在獲取數據或更新界面失敗時,會彈出錯誤提示框,告知用戶具體的錯誤信息。
python腳本內容
import tkinter as tk
from tkinter import ttk, messagebox
import requests
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
import threading# 設置中文字體
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]class WeatherApp:def __init__(self, root):self.root = rootself.root.title("賽博天氣 - 未來氣象預測")self.root.geometry("800x700")self.root.configure(bg="#0A0E17")# 賽博朋克風格顏色self.colors = {'neon_blue': '#00F0FF','neon_purple': '#BF00FF','neon_pink': '#FF00FF','neon_green': '#00FF9C','dark_900': '#0A0E17','dark_800': '#141E30','dark_700': '#1A2940'}# 創建加載中指示器self.loading_frame = Noneself.loading_label = None# 創建UIself.create_widgets()# 初始加載北京天氣self.get_weather("北京")def create_widgets(self):# 頂部標題欄title_frame = tk.Frame(self.root, bg=self.colors['dark_900'], bd=2, relief=tk.SOLID)title_frame.pack(fill=tk.X, pady=(0, 10))title_label = tk.Label(title_frame, text="賽博朋克風格天氣查詢", font=("SimHei", 20, "bold"),bg=self.colors['dark_900'],fg=self.colors['neon_blue'],bd=0,highlightthickness=0)title_label.pack(pady=10)# 搜索區域search_frame = tk.Frame(self.root, bg=self.colors['dark_900'])search_frame.pack(fill=tk.X, padx=20, pady=10)self.city_entry = ttk.Entry(search_frame, font=("SimHei", 12),width=30,background=self.colors['dark_800'],foreground=self.colors['neon_blue'])self.city_entry.pack(side=tk.LEFT, padx=(0, 10), ipady=5)self.city_entry.insert(0, "北京")search_btn = ttk.Button(search_frame, text="查詢天氣", command=self.search_weather,style='Neon.TButton')search_btn.pack(side=tk.LEFT, ipady=5)# 創建標簽頁notebook = ttk.Notebook(self.root)notebook.pack(fill=tk.BOTH, expand=True, padx=20, pady=10)# 當前天氣標簽頁current_frame = ttk.Frame(notebook)notebook.add(current_frame, text="當前天氣")# 15天預報標簽頁forecast_frame = ttk.Frame(notebook)notebook.add(forecast_frame, text="15天預報")# 詳細信息標簽頁details_frame = ttk.Frame(notebook)notebook.add(details_frame, text="詳細信息")# 構建各標簽頁內容self.build_current_weather_frame(current_frame)self.build_forecast_frame(forecast_frame)self.build_details_frame(details_frame)# 配置自定義樣式self.configure_styles()def configure_styles(self):style = ttk.Style()# 配置TButton樣式style.configure('TButton', font=("SimHei", 10),background=self.colors['dark_800'],foreground=self.colors['neon_blue'],borderwidth=1,relief=tk.RAISED)# 賽博朋克風格按鈕style.configure('Neon.TButton', font=("SimHei", 10, "bold"),background=self.colors['neon_blue'],foreground=self.colors['dark_900'],borderwidth=0,relief=tk.FLAT)style.map('Neon.TButton', background=[('active', self.colors['neon_pink'])])# 配置標簽樣式style.configure('TLabel', font=("SimHei", 10),background=self.colors['dark_900'],foreground="white")# 標題樣式style.configure('Title.TLabel', font=("SimHei", 16, "bold"),foreground=self.colors['neon_blue'])# 子標題樣式style.configure('Subtitle.TLabel', font=("SimHei", 12, "bold"),foreground=self.colors['neon_purple'])# 數據標簽樣式style.configure('Data.TLabel', font=("SimHei", 14, "bold"),foreground="white")# 數據值樣式style.configure('Value.TLabel', font=("SimHei"