飞道的博客

【Python天气预报系统】又要降温,这个冬天你准备好棉衣秋裤了吗?看了不后悔系列之Python打造智能天气预报系统,爆赞。

377人阅读  评论(0)

前言

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

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

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

周五早晨,终于体验了一把久违冷冷的冰雨💨在脸上胡乱的拍!昨天还有10几度的天气,今天

就  只有2-3°了,真真是老天爷的脸七十二变~

所有文章完整的素材+源码都在👇👇

粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。

最近几天的天气预报图如下:

广东的朋友们,听说你们哪儿最低温度都是10几度,我实名羡慕了——(要我说从哪儿听说

的,昨天跟刺激战场打游戏的合作队友哪儿听说的。狠狠羡慕住了.jpg)

没啥事儿,跟大家谈一谈天气,哈哈哈,今天就给大家用代码写一款Python版天气预报系统,

是Tkinter界面化的,还会制作温度折线图跟气温饼图哦~一整个期待住了吧!💌

正文

先来一波可可爱爱奇奇怪怪的表情包让大家开心一下吧:    

                          jio冷                                                               请问你是不是想冷死我?

                  太冷了                           能温暖我的只有被子         太冷了,麻烦你,替我上下厕所好吗

                          冷 啊,手杆也冷,全身都他m冷,他m的怎么这么冷,jio冷

                               

                               

”喜欢表情包and代码的朋友,请关注我吧,你的关注,是对我最大的奖励哦!

一、前期准备

1)运行环境

本文用到的环境如下——

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

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

的库的话看教程↓


  
  1. 一般安装:pip install +模块名
  2. 镜像源安装:pip install -i https:/ /pypi.douban.com/simple /+模块名
  3. (之前有说过安装报错的几种方式跟解决方法,不会安装的可以去看下,还有很多国内镜像源也有文章的)

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

二、代码展示


  
  1. #coding:utf- 8
  2. from tkinter import *
  3. import re
  4. from time import sleep
  5. from urllib.request import urlopen
  6. from bs4 import BeautifulSoup
  7. import pandas
  8. import prettytable
  9. import matplotlib.pyplot as plt
  10. from datetime import datetime
  11. LOG_LINE_NUM = 0
  12. class MY_GUI():
  13. def __init__(self,init_window_name):
  14. self.init_window_name = init_window_name
  15. #设置窗口
  16. def set_init_window(self):
  17. self.init_window_name. title( "天气预报") #窗口名
  18. self.init_window_name. geometry( '1000x500+200+50')
  19. #标签
  20. self.init_data_label = Label(self.init_window_name, text= "输入城市名")
  21. self.init_data_label. grid(row= 0, column= 0)
  22. self.result_data_label = Label(self.init_window_name, text= "天气预测结果")
  23. self.result_data_label. grid(row= 0, column= 12)
  24. #文本框
  25. self.init_data_Text = Text(self.init_window_name, width= 20, height= 1) #城市名录入框
  26. self.init_data_Text. grid(row= 1, column= 0, rowspan= 2, columnspan= 5)
  27. self.result_data_Text = Text(self.init_window_name, width= 100, height= 30) #处理结果展示
  28. self.result_data_Text. grid(row= 1, column= 12, rowspan= 10, columnspan= 10)
  29. #按钮
  30. self.str_trans_to_md7_button = Button(self.init_window_name, text= "获取天气情况", bg= "lightblue", width= 10,command=self.str_trans_to_md7) # 调用内部方法 加()为直接调用
  31. self.str_trans_to_md7_button. grid(row= 1, column= 11)
  32. self.str_trans_to_img_button = Button(self.init_window_name, text= "获取天气统计图", bg= "lightblue", width= 10,command=self.str_trans_to_img) # 调用内部方法 加()为直接调用
  33. self.str_trans_to_img_button. grid(row= 2, column= 11)
  34. #功能函数
  35. def str_trans_to_md7(self):
  36. #储存天气情况的列表
  37. date,wea,tem_high,tem_low,wind_dire,wind_speed = [],[],[],[],[],[]
  38. #城市转ID
  39. city_id = pandas. read_excel( 'city_id.xlsx')
  40. dict_c = city_id. set_index( 'City_CN').T. to_dict( 'list')
  41. city = self.init_data_Text. get( 1.0,END). strip()
  42. test_id = dict_c[city]
  43. test_id. append( "". join( filter(str.isdigit, test_id[ 0])))
  44. print( '城市ID:',test_id[ 1])
  45. #爬七日天气
  46. html_ID = "http://www.weather.com.cn/weather/"+test_id[ 1]+ ".shtml"
  47. html = urlopen(html_ID)
  48. soup = BeautifulSoup(html. read(), 'html.parser')
  49. ag_links = soup. find_all( "li", {"class": re. compile( 'sky skyid lv\d')})
  50. for ag in ag_links:
  51. date. append(ag.h1. get_text())
  52. wea. append(ag.p. get_text())
  53. tem_high. append(ag.span. get_text())
  54. win = re. findall( '(?<= title=").*?(?=")', str(ag. find( 'p', 'win'). find( 'em'))) #正则问题的处理,摘自csdn
  55. wind_dire. append( '-'. join(win))
  56. for i in range( 7):
  57. tem_low. append(soup. select( '.tem i')[i]. get_text())
  58. wind_speed. append(soup. select( '.win i')[i]. get_text())
  59. #输出图表
  60. table_ = prettytable. PrettyTable()
  61. table_.field_names = [ '日期', '天气', '最高温度', '最低温度', '风向', '风力']
  62. for i in range( 0, len(date)):
  63. table_. add_row([date[i], wea[i], tem_high[i],tem_low[i],wind_dire[i],wind_speed[i]])
  64. print(city, '七日天气')
  65. print(table_)
  66. weafile= open( "近七日天气.txt", "w+")
  67. weafile. write(city)
  68. weafile. write(test_id[ 1]+ '/n')
  69. weafile. write( str(table_))
  70. weafile.close
  71. self.result_data_Text. delete( 1.0,END)
  72. self.result_data_Text. insert( 1.0,table_)
  73. def str_trans_to_img(self):#进行统计图的制作
  74. infopen = open( '近七日天气.txt', 'r', encoding= 'gbk')
  75. outopen = open( 'out1.txt', 'w', encoding= 'gbk')
  76. lines = infopen. readlines()
  77. for line in lines:
  78. if line. split():
  79. outopen. writelines(line)
  80. else:
  81. outopen. writelines( "")
  82. infopen. close()
  83. outopen. close()
  84. with open( "out1.txt", encoding= 'gbk') as fp_in:
  85. with open( 'out.txt', 'w', encoding= 'gbk') as fp_out:
  86. fp_out. writelines(line for i, line in enumerate(fp_in) if i > 2 and i< 10)
  87. # clearnumber
  88. file = open( "out.txt", "r") # 以只读模式读取文件
  89. something=file. readlines()
  90. new=[]
  91. for x in something:
  92. first = x. strip( '\n')
  93. second=first. split()
  94. while '|' in second:
  95. second. remove( '|')
  96. new. append(second)
  97. dates, highs, lows = [], [], []
  98. for day in range( 7):
  99. highs. append( int(new[day][ 2]))
  100. lows. append( int(new[day][ 3][ 0: 2]))
  101. dates. append(new[day][ 0])
  102. fig = plt. figure(dpi= 128, figsize=( 10, 6))
  103. plt. plot(dates, highs, c= 'red', alpha= 0.5) # alpha指定颜色透明度
  104. plt. plot(dates, lows, c= 'blue', alpha= 0.5) # 注意dates和highs 以及lows是匹配对应的
  105. plt. fill_between(dates, highs, lows, facecolor= 'blue', alpha= 0.1) # facecolor指定了区域的颜色
  106. # 设置图形格式
  107. plt.rcParams[ 'font.sans-serif']=[ 'SimHei'] #显示中文标签
  108. plt.rcParams[ 'axes.unicode_minus']=False
  109. plt. title( "近七日温度", fontsize= 24)
  110. plt. xlabel( '', fontsize= 14)
  111. fig. autofmt_xdate() # 让x轴标签斜着打印避免拥挤
  112. plt. ylabel( 'Temperature(℃)', fontsize= 14)
  113. plt. tick_params(axis= 'both', which= 'major', labelsize= 14)
  114. plt. savefig( '温度折线图.jpg')
  115. plt. show()
  116. dic_wea = {}
  117. for i in range( 0, 7):
  118. if new[i][ 1] in dic_wea. keys():
  119. dic_wea[new[i][ 1]] += 1
  120. else:
  121. dic_wea[new[i][ 1]] = 1
  122. plt.rcParams[ 'font.sans-serif'] = [ 'SimHei']
  123. print(dic_wea)
  124. explode = [ 0.01] * len(dic_wea. keys())
  125. color = [ 'lightskyblue', 'silver', 'yellow', 'salmon', 'grey', 'lime', 'gold', 'red', 'green', 'pink']
  126. plt. pie(dic_wea. values(), explode=explode, labels=dic_wea. keys(), autopct= '%1.1f%%', colors=color)
  127. plt. title( '未来7天气候分布饼图')
  128. plt. savefig( '气候饼图.jpg')
  129. plt. show()
  130. def gui_start():
  131. init_window = Tk() #实例化出一个父窗口
  132. ZMJ_PORTAL = MY_GUI(init_window)
  133. ZMJ_PORTAL. set_init_window() # 设置根窗口默认属性
  134. init_window. mainloop() #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示
  135. gui_start()

三、效果展示

1)天气预报系统

​2)温度折线图

3)气温饼图

总结

这几天天气确实真的有点冷(狠冷),朋友开玩笑说:冷到连鬼都冷死了。哈哈哈啊,哪不得

冬天的多造一造,比如多看看鬼片,不怕他们出来!

安啦,今天的天气预报系统就是个简单的界面哈做起来挺简单的,喜欢的点个关注哦~

🎯完整的免费源码领取处:找我吖!文末公众hao可自行领取,滴滴我也可!

🔨推荐往期文章——

项目1.0  漫天飞雪小程序

Python小程序:你看?这千年难遇的雪景——简直“美到犯规”【满屏雪花飞舞】

项目2.7   刮刮卡小程序

周末老板请吃东西,刮到多少算多少?Python带你制作一款刮刮卡小程序。

项目 4.0 GIF制作神奇(斗罗大陆为例)

【Python神器】推荐这款傻瓜式GIF制作工具,以后别再说不会了(好用到爆~)

 项目  4.1 普通人VS程序员关机小程序

【普通人VS程序员】电脑还可以这样关机,神操作,学到了学到了~(收藏起来慢慢学)

 项目5.2  终极智商测试系统

【PythonIQ测试系统】学了一招测试一下女友的智商,这离谱的反射弧~麻了麻了(终极智商测试)

项目5.3  四六级小程序

【Python小系统】四级考满分的学姐告诉你这样学英语逢考必过,赶紧康康叭~(捷径分享)

🎄文章汇总——

汇总合集  Python—2022 |已有文章汇总 | 持续更新,直接看这篇就够了

(更多内容+源码都在✨文章汇总哦!!欢迎阅读喜欢的文章🎉~)


转载:https://blog.csdn.net/weixin_55822277/article/details/128339397
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场