Python实战之天气预报系统的实现

目录
  • 前言
  • 一、前期准备
  • 二、代码展示
  • 三、效果展示

前言

鼎鼎大名的南方城市长沙很早就入冬了,街上各种大衣,毛衣,棉衣齐齐出动。

这段时间全国各地大风呜呜地吹,很多地方断崖式降温。

虽然前几天短暂的温度回升,但肯定是为了今天的超级降温,一大早的就开始狂风四起。

周五早晨,终于体验了一把久违冷冷的冰雨在脸上胡乱的拍!昨天还有10几度的天气,今天就  只有2-3°了,真真是老天爷的脸七十二变~

广东的朋友们,听说你们哪儿最低温度都是10几度,我实名羡慕了——(要我说从哪儿听说的,昨天跟刺激战场打游戏的合作队友哪儿听说的。狠狠羡慕住了.jpg)

没啥事儿,跟大家谈一谈天气,哈哈哈,今天就给大家用代码写一款Python版天气预报系统,是Tkinter界面化的,还会制作温度折线图跟气温饼图哦~一整个期待住了吧!

一、前期准备

1)运行环境

本文用到的环境如下——

Python3、Pycharm社区版,第三方模块:tkinter、bs4(BeautifulSoup)、pandas、

prettytable、matplotlib、re。部分自带的库只要安装完Python就可以直接使用了

一般安装:pip install +模块名

镜像源安装:pip install -i https://pypi.douban.com/simple/+模块名

有准备一些数据源素材等这些大家可以用自己准备的就可以了。

二、代码展示

#coding:utf-8
from tkinter import *
import re
from time import sleep
from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas
import prettytable
import matplotlib.pyplot as plt
from datetime import datetime
LOG_LINE_NUM = 0

class MY_GUI():
    def __init__(self,init_window_name):
        self.init_window_name = init_window_name

    #设置窗口
    def set_init_window(self):
        self.init_window_name.title("天气预报")           #窗口名
        self.init_window_name.geometry('1000x500+200+50')
        #标签
        self.init_data_label = Label(self.init_window_name, text="输入城市名")
        self.init_data_label.grid(row=0, column=0)
        self.result_data_label = Label(self.init_window_name, text="天气预测结果")
        self.result_data_label.grid(row=0, column=12)
        #文本框
        self.init_data_Text = Text(self.init_window_name, width=20, height=1)  #城市名录入框
        self.init_data_Text.grid(row=1, column=0, rowspan=2, columnspan=5)
        self.result_data_Text = Text(self.init_window_name, width=100, height=30)  #处理结果展示
        self.result_data_Text.grid(row=1, column=12, rowspan=10, columnspan=10)
        #按钮
        self.str_trans_to_md7_button = Button(self.init_window_name, text="获取天气情况", bg="lightblue", width=10,command=self.str_trans_to_md7)  # 调用内部方法  加()为直接调用
        self.str_trans_to_md7_button.grid(row=1, column=11)
        self.str_trans_to_img_button = Button(self.init_window_name, text="获取天气统计图", bg="lightblue", width=10,command=self.str_trans_to_img)  # 调用内部方法  加()为直接调用
        self.str_trans_to_img_button.grid(row=2, column=11)

    #功能函数
    def str_trans_to_md7(self):
        #储存天气情况的列表
        date,wea,tem_high,tem_low,wind_dire,wind_speed = [],[],[],[],[],[]
        #城市转ID
        city_id = pandas.read_excel('city_id.xlsx')
        dict_c = city_id.set_index('City_CN').T.to_dict('list')
        city = self.init_data_Text.get(1.0,END).strip()
        test_id = dict_c[city]
        test_id.append("".join(filter(str.isdigit, test_id[0])))
        print('城市ID:',test_id[1])
        #爬七日天气
        html_ID = "http://www.weather.com.cn/weather/"+test_id[1]+".shtml"
        html = urlopen(html_ID)
        soup = BeautifulSoup(html.read(),'html.parser')
        ag_links = soup.find_all("li", {"class": re.compile('sky skyid lv\d')})
        for ag in ag_links:
            date.append(ag.h1.get_text())
            wea.append(ag.p.get_text())
            tem_high.append(ag.span.get_text())
            win = re.findall('(?<= title=").*?(?=")', str(ag.find('p','win').find('em'))) #正则问题的处理,摘自csdn
            wind_dire.append( '-'.join(win))
        for i in range(7):
            tem_low.append(soup.select('.tem i')[i].get_text())
            wind_speed.append(soup.select('.win i')[i].get_text())
        #输出图表
        table_ = prettytable.PrettyTable()
        table_.field_names = ['日期','天气', '最高温度','最低温度','风向','风力']
        for i in range(0,len(date)):
            table_.add_row([date[i], wea[i], tem_high[i],tem_low[i],wind_dire[i],wind_speed[i]])
        print(city,'七日天气')
        print(table_)
        weafile=open("近七日天气.txt","w+")
        weafile.write(city)
        weafile.write(test_id[1]+'/n')
        weafile.write(str(table_))
        weafile.close
        self.result_data_Text.delete(1.0,END)
        self.result_data_Text.insert(1.0,table_)
    def str_trans_to_img(self):#进行统计图的制作
        infopen = open('近七日天气.txt', 'r', encoding='gbk')
        outopen = open('out1.txt', 'w', encoding='gbk')
        lines = infopen.readlines()
        for line in lines:
            if line.split():
                outopen.writelines(line)
            else:
                outopen.writelines("")
        infopen.close()
        outopen.close()
        with open("out1.txt", encoding='gbk') as fp_in:
            with open('out.txt', 'w', encoding='gbk') as fp_out:
                fp_out.writelines(line for i, line in enumerate(fp_in) if i > 2 and i<10)
        # clearnumber
        file = open("out.txt", "r")  # 以只读模式读取文件
        something=file.readlines()
        new=[]
        for x in something:
            first = x.strip('\n')
            second=first.split()
            while '|' in second:
                second.remove('|')
            new.append(second)

        dates, highs, lows = [], [], []
        for day in range(7):
            highs.append(int(new[day][2]))
            lows.append(int(new[day][3][0:2]))
            dates.append(new[day][0])

        fig = plt.figure(dpi=128, figsize=(10, 6))
        plt.plot(dates, highs, c='red', alpha=0.5) # alpha指定颜色透明度
        plt.plot(dates, lows, c='blue', alpha=0.5) # 注意dates和highs 以及lows是匹配对应的
        plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1) # facecolor指定了区域的颜色
        # 设置图形格式
        plt.rcParams['font.sans-serif']=['SimHei'] #显示中文标签
        plt.rcParams['axes.unicode_minus']=False
        plt.title("近七日温度", fontsize=24)
        plt.xlabel('', fontsize=14)
        fig.autofmt_xdate() # 让x轴标签斜着打印避免拥挤
        plt.ylabel('Temperature(℃)', fontsize=14)
        plt.tick_params(axis='both', which='major', labelsize=14)
        plt.savefig('温度折线图.jpg')
        plt.show()

        dic_wea = {}
        for i in range(0, 7):
            if new[i][1] in dic_wea.keys():
                dic_wea[new[i][1]] += 1
            else:
                dic_wea[new[i][1]] = 1
        plt.rcParams['font.sans-serif'] = ['SimHei']
        print(dic_wea)
        explode = [0.01] * len(dic_wea.keys())
        color = ['lightskyblue', 'silver', 'yellow', 'salmon', 'grey', 'lime', 'gold', 'red', 'green', 'pink']
        plt.pie(dic_wea.values(), explode=explode, labels=dic_wea.keys(), autopct='%1.1f%%', colors=color)
        plt.title('未来7天气候分布饼图')
        plt.savefig('气候饼图.jpg')
        plt.show()

def gui_start():
    init_window = Tk()              #实例化出一个父窗口

    ZMJ_PORTAL = MY_GUI(init_window)

    ZMJ_PORTAL.set_init_window()    # 设置根窗口默认属性

    init_window.mainloop()          #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示

gui_start()

三、效果展示

1)天气预报系统

​2)温度折线图

3)气温饼图

到此这篇关于Python实战之天气预报系统的实现的文章就介绍到这了,更多相关Python天气预报系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python显示天气预报

    复制代码 代码如下: import urllib2import jsonimport stringurl ='http://m.weather.com.cn/data/101090502.html're = urllib2.urlopen(url).read()we = json.loads(re)['weatherinfo']print we['city'] , we['date_y'].center(30) ,   we['week']print we['temp1'], we['weath

  • 基于Python实现定时自动给微信好友发送天气预报

    效果图 from wxpyimport * import requests from datetimeimport datetime import time from apscheduler.schedulers.blockingimport BlockingScheduler#定时框架 bot = Bot(cache_path=True) tuling = Tuling(api_key=你的api')#机器人api def send_weather(location): #准备url地址 pa

  • python将天气预报可视化

    目录 前言 结果展示 程序代码 期望 前言 在想题材之际,打开私信,有许多萌新&小伙伴询问我之前写的一篇<python爬取天气预报数据,并实现数据可视化>中的bug怎么解决,虽然我在之前,就在评论区提供了自己的解决思路,但可能不够清楚,于是写这篇文章,来解决bug,并对程序进行优化. 结果展示 其中: 红线代表当天最高气温,蓝线代表最低气温,最高气温点上的标注为当天的天气情况. 如果使夜晚运行程序,则最高气温和最低气温的点会重合,使由爬取数据产生误差导致的. 程序代码 详细请看注释 #

  • python制作的天气预报小工具(gui界面)

    一.准备工作 不需要准备. 二.预览 1.启动 启动以后自动定位所在城市,展示定位城市的天气. 2.添加城市 3.展示多个城市天气 添加天气之后能够显示多个城市天气信息. 三.设计流程 1.获取城市天气信息过程 用此流程图展示定位城市信息到获取城市天气信息过程. 四.源代码 1.Weather_Tool-v1.0.py from tkinter import * from tkinter import ttk from PIL import Image,ImageTk from tkinter

  • python实现智能语音天气预报

    python编写的语音天气预报 本系统主要包括四个函数: 1.获取天气数据 1.输入要查询天气的城市 2.利用urllib模块向中华万年历天气api接口请求天气数据 3.利用gzip解压获取到的数据,并编码utf-8 4.利用json转化成python识别的数据,返回为天气预报数据复杂形式的字典(字典中的字典) 2.输出当天天气数据 1.格式化输出当天天气,包括:天气状况,此时温度,最高温度.最低温度,风级,风向等. 3,语音播报当天天气 1.创建要输出的语音文本(weather_forecas

  • Python定时发送天气预报邮件代码实例

    这篇文章主要介绍了Python定时发送天气预报邮件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用python爬虫爬到的天气预报,使用smtplib和email模块可以发送到邮箱,使用schedule模块可以定时发送.以下是代码- #导入模块 import requests from bs4 import BeautifulSoup import smtplib from email.mime.text import MIMEText

  • Python实战之天气预报系统的实现

    目录 前言 一.前期准备 二.代码展示 三.效果展示 前言 鼎鼎大名的南方城市长沙很早就入冬了,街上各种大衣,毛衣,棉衣齐齐出动. 这段时间全国各地大风呜呜地吹,很多地方断崖式降温. 虽然前几天短暂的温度回升,但肯定是为了今天的超级降温,一大早的就开始狂风四起. 周五早晨,终于体验了一把久违冷冷的冰雨在脸上胡乱的拍!昨天还有10几度的天气,今天就  只有2-3°了,真真是老天爷的脸七十二变~ 广东的朋友们,听说你们哪儿最低温度都是10几度,我实名羡慕了——(要我说从哪儿听说的,昨天跟刺激战场打游

  • Python实战之实现简易的学生选课系统

    一.实验目的 实现学生选课系统 二.实验环境 Python3.6 pymysql(Python连接MySQL) xlrd(操作Excel) 三.程序结构 1.首先运行First_run.py: 功能:创建数据库.表等信息 2.运行seconnd_run.py: 功能: 实现学生选课 3.账号密码.xlsx: 存放学生信息(可以存班级花名册) 如: `` 四.数据库结构 表之间的联系 五.各表功能 student_login:存放学生账号信息(直接导入班级花名册,具体看代码) 字段: s_no:学

  • python实战练习之最新男女颜值打分小系统

    导语​ ​ 哈喽!我是木木子,今天又想我了嘛? 之前不是出过一期Python美颜相机嘛?不知道你们还记得不?这一期的话话题还是围绕上期关于颜值方面来走. 还是原来的配方,还是原来的味道. 偶尔有女生或者说男生都有过这样的经历,偶然照镜子的时候觉得自己美.帅到爆炸.[小编打死不会承认的.jpg] ​ 但打开无美颜的前置摄像头无滤镜,或者看到真正的漂亮小姐姐,又会感慨自己怎么能这么丑! ​ 颜值打分其实是个很有争议,并且人人都感兴趣的话题,那么今天木木子就带着Python颜值打分神器走来了! 如果满

  • Python实战之实现简单的名片管理系统

    一.前言 实现名片管理系统,首先要创建两个python file ,分别是cards_main.py和cards_tool.py,前一个是主代码块的实现,后一个是提供主代码块所调用的函数 二.主代码块的实现 import cards_tool as ct #导入cards_tool文件,简称ct,以便调用其中的函数 while True: ct.show_menu() num=int(input("请选择操作功能:")) print(f"您选择的操作是[{num}]"

  • Python实战之画哆啦A梦(超详细步骤)

    一.写在前面 本文基于64位windows系统(鼠标右键点击桌面"此电脑"图标--属性可查看电脑系统版本).python3.x(pycharm自动安装的版本, 3.0以上).文中代码内容所使用的工具是pycharm-community-2020.1,实践中如有碰到问题,可留言提问. 前阵子有看到zh上有大神画了这个哆啦A梦的大头贴,自己也来试了一下,很简单,但长篇整段的代码对刚刚学会海龟绘图语法的初学者来说还是有一定难度,所以来做一个拆解版详细步骤讲解实现. 二.效果图 言归正传,先上

  • Python实战之用tkinter库做一个鼠标模拟点击器

    前言 用Python做一个鼠标模拟点击器,可以实现多位置,定时,定次数,定区域随机位置点击,对于一些比较肝的游戏(痒痒鼠之类的),挂机非常有帮助,解放双手;定区域随机点击可以一定程度上防止系统检测出有使用脚本开挂的行为 import tkinter as tk import random import pyautogui as mouse from tkinter.messagebox import * 安装库 首先是今天要用到的几个必要的库:tkinter,random,pyautogui 没

  • Python实战之能监控文件变化的神器—看门狗

    一.前言 假设现在有一个应用场景,需要对文件系统进行监控,发生变化时产生日志,对新增的文件做一些相应的操作. 比如说应用到我们之前的音乐高潮提取器:若当前文件夹下增加了一个音乐文件,监控器就调用音乐高潮提取器,自动提取该音乐文件的高潮部分. 这样的监控器写起来也不难,但是很花时间,有许多情况要考虑.不过幸好我们是写Python的,有许多轮子可以使用. 二.准备 开始之前,你要确保Python和pip已经成功安装在电脑上噢. Windows环境下打开Cmd(开始-运行-CMD),苹果系统环境下请打

  • Python实战练习之终于对肯德基下手

    准备工作 查看肯德基官网的请求方法:post请求. X-Requested-With: XMLHttpRequest 判断得肯德基官网是ajax请求 通过这两个准备步骤,明确本次爬虫目标: ajax的post请求肯德基官网 获取上海肯德基地点前10页. 分析 获取上海肯德基地点前10页,那就需要先对每页的url进行分析. 第一页 # page1 # http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname # POST # cnam

  • Python实战之整蛊神器合集加速友尽

    目录 导语 正文 (1)杀死ta的QQ. ​(2)格式化磁盘. (3)让ta说ta是猪. ​(4)直接死机. ​(5)一直说You are pig! (6)  重复说话200次. (7)给我按200次回车. (8)Alt+F4超可怕. (9)问答形式. (10)强制表白. 番外篇--表白! ​总结 导语 哈喽!哈喽!我是木木子,最近沉迷整蛊这种类型的代码,特别有趣好玩! 虽然踩中了特别多的坑,但是越玩越上瘾呀!这里整理了蛮多整蛊的代码,好东西就是需要分享的嘛~ 每周一招维护友谊的小秘诀,欢迎大家

  • Python实战案例之可增删改查的员工管理系统

    目录 一.分析 (一)大纲 (二)添加员工 (三)删除员工 (四)查找员工 (五)修改员工 二.实现代码 三.测试 一.分析 (一)大纲 1.首先创建一个空列表,用来存储员工信息,即employee = []. 2.管理系统主要通过while True语句来进行无限循环,如果while条件判断语句永远为True,则循环将会无限执行.在循环中可通过continue语句和break语句来分别跳出本次循环和整个循环. 3.设定六个数字1-6依次对应对该系统的不同操作,这里使用一个if-else语句,若

随机推荐