日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python制作的天氣預報小工具(gui界面)

瀏覽:58日期:2022-06-18 15:08:58
目錄一.準備工作二.預覽1.啟動2.添加城市3.展示多個城市天氣三.設計流程1.獲取城市天氣信息過程四.源代碼1.Weather_Tool-v1.0.py2.Weather_Spider.py五.總結一.準備工作

不需要準備。

二.預覽1.啟動

啟動以后自動定位所在城市,展示定位城市的天氣。

python制作的天氣預報小工具(gui界面)

2.添加城市

python制作的天氣預報小工具(gui界面)

3.展示多個城市天氣

添加天氣之后能夠顯示多個城市天氣信息。

python制作的天氣預報小工具(gui界面)

三.設計流程1.獲取城市天氣信息過程

用此流程圖展示定位城市信息到獲取城市天氣信息過程。

python制作的天氣預報小工具(gui界面)

四.源代碼1.Weather_Tool-v1.0.py

from tkinter import *from tkinter import ttkfrom PIL import Image,ImageTkfrom tkinter import messageboxfrom Weather_Spider import Weather_Getfrom threading import Threadimport datetimeimport time’’’5-11.打開首頁定位當前位置獲取天氣 (ip定位+jieba分詞+城市號+城市天氣) **5.11實現**2.用戶手動選擇,查看當前所選城市天氣 (Toplevel+Combobox) **已實現**5-141.加入notepad,顯示多個城市天氣 (notebook Frame) **已實現**2.頻繁刷新檢測(線程計時10秒) **已實現**3.用戶選擇主題 (Menu.add_radiobutton()) **已實現**4.一個窗口多個Combobox,怎樣處理選擇事件**已實現**5-151.右擊notebook frame標題出現“關閉”菜單**已砍掉**2.用戶添加了城市后,label出現在了最后的Frame中**未實現**’’’imgs=[’./img/loading.png’]class App: def __init__(self):self.w=Tk()self.w.title(’天氣預報小工具-v1.0’)width=600height=282left=(self.w.winfo_screenwidth()-width)/2top=(self.w.winfo_screenheight()-height)/2self.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.mself.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 = imgsimg = 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=300height=140left=(self.t.winfo_screenwidth()-width)/2top=(self.t.winfo_screenheight()-height)/2self.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.regionif 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_itemcity=locationi = 0for data in item[’recent’]: self.tree2.insert(’’, i, values=(data.get(’日期’), data.get(’天氣’), data.get(’風力風向’), data.get(’最低氣溫’), data.get(’最高氣溫’))) i += 1self.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-8import requestsimport jsonfrom lxml import etreeimport jiebaclass 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=Falsetry: r=s.get(url,headers=headers) r.encoding=’utf-8’ if r.status_code==200:r.encoding = r.apparent_encodingreturn r.text else:return Noneexcept 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 itemexcept 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 numberelse: 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=0for 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+=1item[’recent’]=item_listreturn 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,weatherelse: return False五.總結

本次使用Tkinter寫了一款天氣預報小工具,基本支持全國每個省市的天氣預報,支持歷史天氣(昨天)查看,雖然基本功能能夠實現,但是仍舊存在兩個小問題:1.添加超過兩個城市天氣后,具體城市信息會顯示在最新添加的Freame中。2.ip定位不準確。

本程序還有兩個特色:

1.支持更換主題。2.程序首次啟動加入了加載過渡。其他的彩蛋,您自己去發現吧!程序放在了藍奏云。思路、代碼方面有什么不足歡迎各位大佬指正、批評!

以上就是python制作的天氣預報小工具(gui界面)的詳細內容,更多關于python 天氣預報工具的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区导航| 综合干狼人综合首页| 国产欧美自拍一区| 亚洲高清成人| 高清久久一区| 另类综合日韩欧美亚洲| 性欧美精品高清| 精品久久久中文字幕| 91精品丝袜国产高跟在线| 91成人超碰| 亚洲a一区二区三区| 国产成人a视频高清在线观看| 欧美亚洲综合视频| 视频一区中文字幕精品| 欧美日韩视频| 在线亚洲一区| 亚洲一区二区网站| 蜜桃国内精品久久久久软件9| 成人在线黄色| 成人国产精品一区二区免费麻豆| 国产精品伦一区二区| 婷婷精品在线| 国产欧美日韩综合一区在线播放| 69堂免费精品视频在线播放| 亚洲乱码视频| 91成人精品观看| 麻豆91在线播放| 精品99久久| 激情自拍一区| 久久电影一区| 日韩精品免费视频一区二区三区| 亚洲欧洲专区| 91精品福利观看| 国产精品a级| 成人自拍av| 蜜臀va亚洲va欧美va天堂| 日韩av电影一区| 中国字幕a在线看韩国电影| 99视频精品视频高清免费| 亚洲一区二区小说| 精品高清久久| 日韩精品一级中文字幕精品视频免费观看| 精品91久久久久| 国产精品一线天粉嫩av| 97精品国产| 国产免费成人| 国产福利片在线观看| 亚洲精品一二| 久久国产高清| 国产在线一区不卡| 在线日韩中文| 免费日韩av片| 丰满少妇一区| 日韩中文字幕一区二区高清99| 久久国内精品| 亚洲一区二区三区免费在线观看| 国产精品亚洲综合久久| 午夜日本精品| 色婷婷色综合| 国产日韩精品视频一区二区三区| 超碰在线99| 日韩欧美中文字幕在线视频| 国产图片一区| 性色一区二区| 婷婷激情综合| 日韩中文影院| 丁香婷婷久久| 国产精品v日韩精品v欧美精品网站| av亚洲在线观看| 国产a久久精品一区二区三区| 91成人小视频| 日韩精品91亚洲二区在线观看| 99久久精品网| 欧美国产小视频| 精品美女久久| 精品国产美女a久久9999| 国产调教一区二区三区| 美女被久久久| 黄色成人精品网站| 亚洲精品网址| 视频在线在亚洲| 日韩一区精品视频| 免费久久99精品国产| 久久www成人_看片免费不卡| 鲁大师成人一区二区三区| 黄色成人精品网站| 亚洲一区中文| 亚洲久久一区| 国产图片一区| 精品美女在线视频| 日韩福利一区| 婷婷亚洲综合| 红桃视频亚洲| 中文字幕一区二区av| 视频一区视频二区中文| 色综合视频一区二区三区日韩 | 国产一区二区三区四区二区| 国产剧情一区二区在线观看| 国产精品美女久久久久久不卡| 欧美视频一区| 国产va免费精品观看精品视频| 亚洲爱爱视频| 综合激情婷婷| 精品一二三区| 久久久久久美女精品| 亚洲v在线看| 国产精品腿扒开做爽爽爽挤奶网站| 婷婷视频一区二区三区| 久久97视频| 亚洲中字黄色| 精品视频黄色| 久色成人在线| 福利精品在线| 亚洲色图综合| 日韩在线高清| 日本欧美久久久久免费播放网| 91亚洲国产成人久久精品| 美女久久网站| 中文字幕在线看片| 91亚洲精品在看在线观看高清| 亚洲国产福利| 亚洲精品欧洲| 久久亚洲国产| 水蜜桃久久夜色精品一区| 亚洲精品精选| 亚洲欧美日韩国产| 亚洲成人精品| 成午夜精品一区二区三区软件| 免费观看在线色综合| 久久激情一区| 中文字幕人成乱码在线观看 | 日韩欧美一区二区三区在线观看 | 精品中文字幕一区二区三区四区| 亚洲一区av| 91九色精品| 欧洲亚洲一区二区三区| 国产精品成人自拍| 91成人在线网站| 奇米亚洲欧美| 日韩精品午夜视频| 综合日韩在线| 自拍日韩欧美| 国产一区日韩欧美| 成人免费网站www网站高清| 麻豆国产精品| 精品一区91| 神马午夜在线视频| 欧美日韩免费观看视频| 国产精品久久久久9999高清| 99精品99| 免费看欧美美女黄的网站| 羞羞答答国产精品www一本| 欧美精品一区二区久久| 国产毛片久久| 日韩精品免费一区二区夜夜嗨 | 亚洲尤物在线| 亚洲综合电影一区二区三区| 国产精品婷婷| 亚洲开心激情| 国产日韩视频在线| 久久精品伊人| 久久久久久久久丰满| 蜜桃久久久久久| 亚洲欧洲高清| 91精品啪在线观看国产爱臀| 99热国内精品| 麻豆精品久久久| 好吊视频一区二区三区四区| 卡一卡二国产精品| 日本视频一区二区| 亚洲欧美日韩一区在线观看| 91亚洲国产成人久久精品| 日本一区二区三区视频在线看 | 国产精品免费不| 免费人成精品欧美精品| 国产在线|日韩| 成人在线丰满少妇av| 日韩不卡免费视频| 国产女优一区| 不卡视频在线| 久久中文字幕av一区二区不卡| 国产人成精品一区二区三| 六月婷婷一区| 亚洲欧美成人综合| 欧美成人综合| 欧美69视频| 久久香蕉国产| 群体交乱之放荡娇妻一区二区| 国产在线一区不卡| 国产精品手机在线播放| 婷婷综合一区| 欧美一级一区| 欧美天堂一区二区| 日韩动漫一区| 国产乱人伦丫前精品视频| 日韩精品午夜视频| 日韩影院精彩在线| 亚洲精品伊人| 国产精品qvod| 老牛国内精品亚洲成av人片 |