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 import messagebox
from Weather_Spider import Weather_Get
from threading import Thread
import datetime
import time

'''
5-1
1.打开首页定位当前位置获取天气    (ip定位+jieba分词+城市号+城市天气) **5.11实现**
2.用户手动选择,查看当前所选城市天气 (Toplevel+Combobox) **已实现**

5-14
1.加入notepad,显示多个城市天气    (notebook Frame)    **已实现**
2.频繁刷新检测(线程计时10秒)   **已实现**
3.用户选择主题    (Menu.add_radiobutton())    **已实现**
4.一个窗口多个Combobox,怎样处理选择事件	**已实现**

5-15
1.右击notebook frame标题出现“关闭”菜单	**已砍掉**
2.用户添加了城市后,label出现在了最后的Frame中	**未实现**

'''
imgs=['./img/loading.png']
class App:
    def __init__(self):
        self.w=Tk()
        self.w.title('天气预报小工具-v1.0')
        width=600
        height=282
        left=(self.w.winfo_screenwidth()-width)/2
        top=(self.w.winfo_screenheight()-height)/2
        self.w.geometry('%dx%d+%d+%d'%(width,height,left,top))
        self.w.iconbitmap('biticon.ico')
        self.w.resizable(False,False)
        self.cerate_widgets()
        self.first_launch()
        self.set_widgets()
        self.place_widgets()
        self.thread_it(self.show_local_weather)
        self.w.mainloop()

    def cerate_widgets(self):
        self.note=ttk.Notebook()
        self.f1=Frame()
        self.tree=ttk.Treeview(self.f1)
        self.l1_var=StringVar()
        self.l1=ttk.Label(self.f1,textvariable=self.l1_var)
        self.m=Menu(self.w)
        self.w['menu']=self.m
        self.s1=Menu(self.m,tearoff=False)
        self.s2=Menu(self.m,tearoff=False)
        self.s3=Menu(self.m,tearoff=False)

    def set_widgets(self):
        self.location=[]
        style = ttk.Style(self.w)
        style.theme_use("default")
        columns=('rq','tq','flfx','zdqw','zgqw')
        self.tree.config(show='headings',columns=columns)
        self.tree.column(columns[0],anchor=CENTER,minwidth=95,width=110)
        self.tree.column(columns[1],anchor=CENTER,minwidth=60,width=70)
        self.tree.column(columns[2],anchor=CENTER,minwidth=90,width=100)
        self.tree.column(columns[3],anchor=CENTER,minwidth=90,width=100)
        self.tree.column(columns[4],anchor=CENTER,minwidth=90,width=100)
        self.tree.heading('rq', text='日期')
        self.tree.heading('tq', text='天气')
        self.tree.heading('flfx', text='风向风力')
        self.tree.heading('zdqw', text='最低气温')
        self.tree.heading('zgqw', text='最高气温')
        self.m.add_cascade(label='开始',menu=self.s1)
        self.s1.add_command(label='aaa',command='')
        self.s1.add_separator()
        self.s1.add_command(label='退出',command=self.quit_window)
        self.m.add_cascade(label='操作',menu=self.s2)
        self.s2.add_command(label='刷新',command=lambda:self.thread_it(self.refresh_weather))
        self.s2.add_command(label='添加城市',command=lambda:self.thread_it(self.select_city),state='disable')
        s2_sub = Menu(self.s2, tearoff=0)
        self.s2.add_separator()
        self.s2.add_cascade(label='更换主题',menu=s2_sub)
        self.m.add_cascade(label='关于',menu=self.s3)
        self.s3.add_command(label='关于作者',command=lambda :messagebox.showinfo('关于作者','作者很神秘,什么都没留下'))
        self.tree.tag_configure('evenColor',background='lightblue')
        self.w.protocol('WM_DELETE_WINDOW',self.quit_window)
        themes=[ 'default','clam', 'alt', 'classic']
        self.themevar=StringVar()
        for i,t in enumerate(themes):
            s2_sub.add_radiobutton(label=t,variable=self.themevar,command=lambda:self.thread_it(self.change_theme),value=t)
        self.themevar.set('default')

    def place_widgets(self):
        self.note.place(x=0,y=0,width=600,height=282)
        self.tree.place(x=0,y=0,width=600,height=150)
        self.l1.place(x=0,y=150,height=85,width=600)

    def first_launch(self):
        '''
        第一次启动,展示加载图片提示信息
        :return:
        '''
        self.start_time=time.time()
        paned = PanedWindow(self.w)
        self.img = imgs
        img = Image.open(self.img[0])
        paned.image = ImageTk.PhotoImage(img)
        self.load_img = Label(self.w, image=paned.image)
        self.load_lab = Label(self.w, text='Loading...')
        self.load_img.pack()
        self.load_lab.pack()

    def show_local_weather(self):
        '''
        展示定位天气信息
        :return:
        '''
        self.l1_var.set('正在刷新天气......')
        items = self.tree.get_children()
        for item in items:
            self.tree.delete(item)
        try:
            city,item=Weather_Get().get_local_weather()
            self.load_img.destroy()
            self.load_lab.destroy()
            self.s2.entryconfig('添加城市', state='normal')
            self.note.add(self.f1,text=city)
            i=0
            for data in item['recent']:
                self.tree.insert('', i, values=(
                data.get('日期'), data.get('天气'), data.get('风力风向'), data.get('最低气温'), data.get('最高气温')))
                i+=1
            self.l1_var.set(f'今天:{self.show_date()}\n当前所在地区:{city}\n当前气温:{item["now"]}\n感冒指数:{item["ganmao"]}')
        except TypeError:
            messagebox.showerror('错误','天气信息加载失败!')
            self.l1_var.set('天气信息加载失败!')
            self.s2.entryconfig('添加城市', state='normal')

    def refresh_weather(self):
        """
        刷新天气后,10秒内不能点击刷新
        :return:
        """
        self.s2.entryconfig('刷新', state='disable')
        self.show_local_weather()
        self.thread_it(self.wait_time)

    def wait_time(self):
        '''
        线程计时10s,十秒后刷新按钮可点击
        :return:
        '''
        time.sleep(10)
        self.s2.entryconfig('刷新', state='normal')

    def show_date(self):
        """
        展示日期信息,便于天气展示
        :return:
        """
        date = str(datetime.date.today())
        year,month,day=date.split('-')
        week_day_dict = {
            0: '星期一',
            1: '星期二',
            2: '星期三',
            3: '星期四',
            4: '星期五',
            5: '星期六',
            6: '星期日 ',
        }
        now=datetime.datetime.now()
        date_index = now.weekday()
        return f'{year}年{month}月{day}日 {week_day_dict[date_index]}'

    def select_city(self):
        '''
        Toplevel让用户选择城市,后台获取城市号
        :return:
        '''
        self.t=Toplevel()
        self.t.resizable(0,0)
        width=300
        height=140
        left=(self.t.winfo_screenwidth()-width)/2
        top=(self.t.winfo_screenheight()-height)/2
        self.t.geometry('%dx%d+%d+%d'%(width,height,left,top))
        self.t.title('选择城市')
        self.tl1=ttk.Label(self.t,text='请选择城市:')
        self.tl1.pack()
        provinces=Weather_Get().get_provinces()
        self.tc1=ttk.Combobox(self.t,justify='center',state='readonly',value=provinces)
        self.tc2=ttk.Combobox(self.t,justify='center',state='readonly')
        self.tc1.pack()
        self.tc1.bind('<<ComboboxSelected>>',self.show_tc2_value)
        self.tc2.bind('<<ComboboxSelected>>',self.show_tc3_value)
        self.tc2.pack()
        self.tc3=ttk.Combobox(self.t,justify='center',state='readonly')
        self.tc3.pack()
        self.tb1=ttk.Button(self.t,text='选择',command=lambda :self.thread_it(self.ack_city))
        self.tb1.pack(pady=10)
#----待完善
    def ack_city(self):
        '''
        Toplevel中选择了城市,选择使用notebook中建立Frame展示所选城市信息
        :return:
        '''
        cityno=self.get_city_no()
        weather_item=Weather_Get().get_weather(cityno)
        location=self.province_name+self.city_name+self.region
        if location in self.location:
            messagebox.showwarning('警告','此城市已添加,请勿重复添加!')
        else:
            self.location.append(location)
            self.f2= Frame(takefocus=True)
            self.note.add(self.f2, text=location)
            self.tree2 = ttk.Treeview(self.f2)
            columns = ('rq', 'tq', 'flfx', 'zdqw', 'zgqw')
            self.tree2.config(show='headings', columns=columns)
            self.tree2.column(columns[0], anchor=CENTER, minwidth=95, width=110)
            self.tree2.column(columns[1], anchor=CENTER, minwidth=60, width=70)
            self.tree2.column(columns[2], anchor=CENTER, minwidth=90, width=100)
            self.tree2.column(columns[3], anchor=CENTER, minwidth=90, width=100)
            self.tree2.column(columns[4], anchor=CENTER, minwidth=90, width=100)
            self.tree2.heading('rq', text='日期')
            self.tree2.heading('tq', text='天气')
            self.tree2.heading('flfx', text='风向风力')
            self.tree2.heading('zdqw', text='最低气温')
            self.tree2.heading('zgqw', text='最高气温')
            self.tree2.place(x=0,y=0,width=600,height=150)
            # label_='label'+str(self.click_no)
            # label_var='label'+str(self.click_no)+'_var'
            self.fl1_var=StringVar()
            self.fl1=ttk.Label(self.f2,textvariable=self.fl1_var)
            self.fl1.place(x=0,y=150,height=85,width=600)
            items = self.tree2.get_children()
            for item in items:
                self.tree2.delete(item)
            try:
                item = weather_item
                city=location
                i = 0
                for data in item['recent']:
                    self.tree2.insert('', i, values=(
                        data.get('日期'), data.get('天气'), data.get('风力风向'), data.get('最低气温'), data.get('最高气温')))
                    i += 1
                self.fl1_var.set(f'今天:{self.show_date()}\n当前所在地区:{city}\n当前气温:{item["now"]}\n感冒指数:{item["ganmao"]}')
            except TypeError:
                messagebox.showerror('错误','天气信息加载失败!')
                self.fl1_var.set(f'{city}天气信息加载失败!')
        self.t.destroy()

    def change_tab(self,*args):
        pass

    def show_tc2_value(self,event):
        '''
        展示"市"级信息
        :param event:
        :return:
        '''
        self.tc2.config(value=[])
        self.tc3.config(value=[])
        self.province_name=self.tc1.get()
        cities=Weather_Get().get_cities(self.province_name)
        self.tc2.config(value=cities)

    def show_tc3_value(self,event):
        '''
        展示"区/县"级信息
        :param event:
        :return:
        '''
        self.city_name=self.tc2.get()
        regions=Weather_Get().get_regions(self.province_name,self.city_name)
        self.tc3.config(value=regions)

    def get_city_no(self):
        """
        根据省、市、区、县 获取城市号
        :return: 城市号
        """
        self.region=self.tc3.get()
        city_no=Weather_Get().get_city_id_by_add(self.province_name,self.city_name,self.region)
        return city_no

    def change_theme(self,):
        '''
        更换主题
        :return:
        '''
        theme=self.themevar.get()
        style = ttk.Style(self.w)
        style.theme_use(theme)

    def quit_window(self):
        ret=messagebox.askyesno('退出','是否要退出?')
        if ret:
            self.w.destroy()

    def thread_it(self,func,*args):
        '''
        防止线程冲突
        :param func:
        :param args:
        :return:
        '''
        t=Thread(target=func,args=args)
        t.setDaemon(True)
        t.start()

if __name__ == '__main__':
    a=App()

2.Weather_Spider.py

#coding:utf-8
import requests
import json
from lxml import etree
import jieba

class Weather_Get():

    def __init__(self):
        self.base_ip_url='http://ip-api.com/json'
        self.location_url='https://ip.tool.chinaz.com/'
        #获取中国国内城市--number接口
        self.city_number_url='http://static.2ktq.com/sktq/common/city_China.json'
        #天气查询接口
        self.base_weather_url='http://wthrcdn.etouch.cn/weather_mini?citykey={}'
        self.headers={
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
        }
        self.item=self.get_city_item()

    def request(self,url,headers):
        """
        请求url,可自定义请求头
        :param url: 请求的url
        :param headers: 自定义的请求头
        :return: 网页文本数据
        """
        s=requests.session()
        s.keep_alive=False
        try:
            r=s.get(url,headers=headers)
            r.encoding='utf-8'
            if r.status_code==200:
                r.encoding = r.apparent_encoding
                return r.text
            else:
                return None
        except requests.exceptions.ConnectionError:
            return None

    def get_city(self):
        """
        通过ip定位到当前城市
        :return:所在省市位置信息
        """
        my_headers={
            'Connection': 'keep-alive',
            'Host': 'ip.tool.chinaz.com',
            'sec-ch-ua': '"Google Chrome";v="89", "Chromium";v="89", ";Not A Brand";v="99"',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
            'Upgrade-Insecure-Requests': '1'
        }
        res = etree.HTML(self.request(self.location_url,headers=my_headers))
        location = res.xpath('//div[@class="WhoIpWrap jspu"]//span[@class="Whwtdhalf w30-0 lh24 tl ml80"]/em/text()')
        #结巴分词好费时间啊
        jieba_cut_result = jieba.lcut(''.join(location))
        try:
            #去除首位的国家和网络类型
            del jieba_cut_result[0]
            del jieba_cut_result[-1]
            item = {}
            # 如果结果为类似 石家庄裕华 则自动加入市区
            if jieba_cut_result[0]!=jieba_cut_result[1]:
                item['province'] = jieba_cut_result[0] + '市'
                item['city'] = jieba_cut_result[1] + "区"
                return item
            else:
                # 如果结果为类似 北京北京 则自动加入市
                item['province'] = jieba_cut_result[0] + '市'
                item['city'] = jieba_cut_result[1] + "市"
                return item
        except IndexError:
            return False

    def get_city_item(self):
        res =self.request(self.city_number_url,headers=self.headers)
        item=eval("{'cities':"+res+"}")
        return item

    def get_provinces(self):
        province=[p for p in self.item['cities']]
        #print(province)
        return province

    def get_cities(self,province):
        cities_=self.item['cities'][province]
        cities=[city for city in cities_.keys()]
        return cities

    def get_regions(self,province,city):
        regions_=self.item['cities'][province][city]
        regions=[region for region in regions_.keys()]
        #print(province,city,regions)
        return regions

    def get_city_id_by_add(self,province,city,region=''):
        if region=='':
            city_no=self.item['cities'][province][city][city].replace('CN','')

        else:
            city_no=self.item['cities'][province][city][region].replace('CN','')
        return city_no

    def get_cityid(self,province,city):
        """
        通过省、市在字典中查找对应的城市号
        :param province: 省
        :param city: 市
        :return: 城市号
        """
        if province in self.item['cities'].keys():
            try:
                #河北省唐山市唐山市(通常的省市)
                number=self.item['cities'][province].get(city).get(city).replace('CN','')
                return number
            except AttributeError:
                number=self.item['cities'][province].get(province).get(city).replace('CN','')
                return number
        else:
            print('未检索到关于{}{}的信息!'.format(province,city))

    def get_weather(self,number):
        weather_data = json.loads(self.request(self.base_weather_url.format(number),self.headers))
        # pprint.pprint(weather_data)
        data=weather_data['data']
        item={}
        yesterday={}
        item_list=[]
        yesterday['日期']=data['yesterday']['date']+'(昨天)'
        item['now']=data['wendu']+'℃'
        item['ganmao']=data['ganmao']
        yesterday['天气']=data['yesterday']['type']
        yesterday['风力风向']=data['yesterday']['fx']+data['yesterday']['fl'].replace('<![CDATA[','').replace(']]>','')
        yesterday['最低气温']=data['yesterday']['low'].replace('低温 ','')
        yesterday['最高气温']=data['yesterday']['high'].replace('高温 ','')
        item_list.append(yesterday)
        count=0
        for weateher in data['forecast']:
            item2={}
            if count==0:
                date=weateher['date']+'(今天)'
            elif count==1:
                date=weateher['date']+'(明天)'
            elif count==2:
                date=weateher['date']+'(后天)'
            else:
                date=weateher['date']+f'({count-1}天后)'
            item2['日期']=date
            item2['天气'] = weateher['type']
            item2['风力风向']=weateher['fengxiang']+weateher['fengli'].replace('<![CDATA[','').replace(']]>','')
            item2['最低气温'] = weateher['low'].replace('低温 ', '')
            item2['最高气温'] = weateher['high'].replace('高温 ', '')
            item_list.append(item2)
            count+=1
        item['recent']=item_list
        return item

    def get_local_weather(self):
        item=Weather_Get().get_city()
        if item:
            p=item['province']
            c=item['city']
            number=Weather_Get().get_cityid(p,c)
            weather=Weather_Get().get_weather(number)
            return p+c,weather
        else:
            return False

五.总结

本次使用Tkinter写了一款天气预报小工具,基本支持全国每个省市的天气预报,支持历史天气(昨天)查看,虽然基本功能能够实现,但是仍旧存在两个小问题
1.添加超过两个城市天气后,具体城市信息会显示在最新添加的Freame中。
2.ip定位不准确。

本程序还有两个特色:

1.支持更换主题。
2.程序首次启动加入了加载过渡。
其他的彩蛋,您自己去发现吧!
程序放在了蓝奏云。思路、代码方面有什么不足欢迎各位大佬指正、批评!

以上就是python制作的天气预报小工具(gui界面)的详细内容,更多关于python 天气预报工具的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 这次要爬的站点是这个:http://www.weather.com.cn/forecast/ 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 首先来到目标数据的网页 http://www.weather.com.cn/weather40d/101280701.shtml 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有部分页面刷新了,就是天气数据的那块,而URL没有变化. 这是因为网页前端使用

  • python获取天气接口给指定微信好友发天气预报

    先看下效果图: 用到的模块: PyMySQL requests threading wxpy 要实现上面的示例,首先是有两大块地方 获取天气信息 通过微信将天气信息发送出去 而获取天气信息又包括几个小的需要注意的地方 获取天气信息 获取天气信息的接口 获取天气信息的城市 获取所在城市的城市码 假如我们给多个人发送天气情况,这几个人来自不同的城市,那么我们不可能每次都要输入城市名,然后查找城市码,然后再访问接口,获取天气情况,这样会非常的麻烦,所以我们需要考虑将城市名跟城市码一一对应起来,说到一一

  • Python爬虫实例扒取2345天气预报

    寒假里学习了一下Python爬虫,使用最简单的方法扒取需要的天气数据,对,没听错,最简单的方法.甚至没有一个函数封装.. 网址:http://tianqi.2345.com/wea_history/53892.htm 火狐中右键查看网页源代码,没有发现天气数据,因此推断网页采用的json格式数据. 右击->查看元素->网络->JS,找到了位置 用Python爬虫下载为json格式数据存储下来,代码如下: #-*- coding:utf-8 -*- import urllib2 impor

  • python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)

    最近想着做一个微信机器人,主要想要实现能够每天定时推送天气预报或励志语录,励志语录要每天有自动更新,定时或当有好友回复时,能够随机推送不同的内容.于是开始了分析思路.博主是采用了多线程群发,因为微信对频繁发送消息过快还会出现发送失败的问题,因此还要加入time.sleep(1),当然时间根据自身情况自己定咯.本想把接入写诗机器人,想想自己的渣电脑于是便放弃了,感兴趣的可以尝试一下.做完会有不少收获希望对你有帮助. (1)我们要找个每天定时更新天气预报的网站,和一个更新励志语录的网站.当然如果你想

  • 详解用python自制微信机器人,定时发送天气预报

    0 引言 前段时间找到了一个免费的天气预报API,费了好段时间把这个API解析并组装成自己想用的格式了,就想着如何实现每天发送天气信息给自己.最近无意中发现了wxpy库,用它来做再合适不过了.以下是wxpy库的简介: wxpy基于itchat,使用了 Web 微信的通讯协议,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计.微信公众号.微信好友.微信群基本信息获取等功能. 废话不多说,代码写起来. 1 环境 操作系统:Windows / Li

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

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

  • Python3爬虫教程之利用Python实现发送天气预报邮件

    前言 此次的目标是爬取指定城市的天气预报信息,然后再用Python发送邮件到指定的邮箱. 下面话不多说了,来一起看看详细的实现过程吧 一.爬取天气预报 1.首先是爬取天气预报的信息,用的网站是中国天气网,网址是http://www.weather.com.cn/static/html/weather.shtml,任意选择一个城市(比如武汉),然后要爬取的内容为下面的部分: 先查看网页源代码,并没有找到第一张图中的内容,说明是这些天气信息是通过别的方式加载出来的.我们打开开发者工具,点击XHR选项

  • python使用itchat模块给心爱的人每天发天气预报

    本文实例为大家分享了python给心爱的人每天发天气预报的具体代码,供大家参考,具体内容如下 下面的代码实现了用了之前获取天气的代码,然后用itchat模块 给指定的人发送消息 代码比较简单,改一下CITY_NAME和name个发送语句直接就可以用 import requests import json import itchat from threading import Timer global CITY_NAME CITY_NAME = "北京" headers = { 'Use

  • 基于Python获取城市近7天天气预报

    这篇文章主要介绍了基于Python获取城市近7天天气预报,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先,我们打开中国天气网,找到黄石市近7天天气的网页. http://www.weather.com.cn/weather/101200601.shtml 然后按F12开始分析网页结构,找到各个标签,并分析它们的作用.h1:日期:p:天气:tem-span:最高温:tem-i:最低温:win:风:em:风向:win-i:风力. 接下来,我们需

  • 40行Python代码实现天气预报和每日鸡汤推送功能

    情人节刚过去几天,但是这和我们程序员有什么关系呢,对我们来说,万物皆对象.但是啊,小编为了讨得仰慕已久的女神的欢心(真香),便用python爬取了爱词霸网站的每日一句和天气预报网站的天气预报,并且每天定时将内容推送到女神的手机短信中(代码实现,不需要短信费哦). 好东西要学会分享,因此小编打算分三个步骤来教大家实现,最后会给出源代码. 第一步,实现爬取爱词霸网站的每日一句: 爱词霸的每日一句包括了英文版和中文版.爬取下来实际上4行有效代码就能搞定,不过为了提高代码的重用性,就将这个功能封装成了一

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

随机推荐