文章目錄
第一個小應用: 案頭天氣
需求:
背景:
簡單的一個桌面視窗,顯示某地區的天氣情況,每小時一次
來源,使用者:
自己
價值:
編程練習
設計:
使用tkinter做出一個小視窗,後天通過中央氣象的json介面獲得天氣情況,手動更新也可以
首先解決擷取json並解析,然後是視窗顯示。
編碼:
#coding:utf8#python2.73 winxp '''天氣外掛程式: 使用json接受中氣象的本地資訊,顯示使用tkinterurl http://www.weather.com.cn/data/sk/101221201.htmlv0.1'''from Tkinter import *import jsonimport urllibimport timedef getWeaInfo(): url = r'http://www.weather.com.cn/data/cityinfo/101221201.html' res = urllib.urlopen(url) #返回的是個json樣式的字串 weatherinfo = {} jinfo = res.read().decode('utf8') #jinfo是一個unicode對象,而我們要的是一個json,然後解析 info = json.loads(jinfo) #變成索引值對 if info: try: weatherinfo['city'] = info['weatherinfo']['city'] #城市 weatherinfo['tempH'] = info['weatherinfo']['temp1'] #高溫 weatherinfo['tempL'] = info['weatherinfo']['temp2'] #低溫 weatherinfo['weather'] = info['weatherinfo']['weather'] #天氣 weatherinfo['ptime'] = info['weatherinfo']['ptime'] #發布時間 except KeyError,e: print 'Do not get the key',e.message return weatherinfoclass WeatherFrame: ''' 用於顯示主架構 ''' def __init__(self): self.root = Tk() #一個標題 self.title = Label(self.root,text=u'天氣情況') self.title.pack(side= TOP) #四對資訊框 self.fm1 = Frame(self.root) self.label_city = Label(self.fm1,text=u'城市') self.label_city.pack(side=LEFT, expand=YES) self.text_city_e = StringVar() self.text_city = Entry(self.fm1, text='', state='readonly', textvariable=self.text_city_e) self.text_city.pack(side=LEFT, expand=YES) self.fm1.pack(side=TOP) self.fm2 = Frame(self.root) self.label_temph = Label(self.fm2,text=u'高溫') self.label_temph.pack(side=LEFT, expand=YES) self.text_temph_e = StringVar() self.text_temph = Entry(self.fm2, text='', state='readonly', textvariable=self.text_temph_e) self.text_temph.pack(side=LEFT, expand=YES) self.fm2.pack(side=TOP) self.fm3 = Frame(self.root) self.label_templ = Label(self.fm3,text=u'低溫') self.label_templ.pack(side=LEFT, expand=YES) self.text_templ_e = StringVar() self.text_templ = Entry(self.fm3, text='', state='readonly', textvariable=self.text_templ_e) self.text_templ.pack(side=LEFT, expand=YES) self.fm3.pack(side=TOP) self.fm4 = Frame(self.root) self.label_weather = Label(self.fm4,text=u'天氣') self.label_weather.pack(side=LEFT, expand=YES) self.text_weather_e = StringVar() self.text_weather = Entry(self.fm4, text='', state='readonly', textvariable=self.text_weather_e) self.text_weather.pack(side=LEFT, expand=YES) self.fm4.pack(side=TOP) #兩個操作按鈕 self.fm5 = Frame(self.root) self.button_pull = Button(self.fm5, text=u'擷取', command=self.pullWeaInfo) self.button_pull.pack(side=LEFT, expand=YES) self.button_quit = Button(self.fm5, text=u'退出', command=self.root.quit) self.button_quit.pack(side=LEFT, expand=YES) self.fm5.pack(side=TOP) self.pullWeaInfo() def pullWeaInfo(self): #推送天氣資訊,初始化推送,手動更新 weainfo = getWeaInfo() self.text_city_e.set(weainfo['city']) self.text_temph_e.set(weainfo['tempH']) self.text_templ_e.set(weainfo['tempL']) self.text_weather_e.set(weainfo['weather']) print ('lastest updated time is %s'%time.ctime()) if __name__=='__main__': wf = WeatherFrame() mainloop()
測試:總結:很簡陋,功能是有了,需要做的還有很多,積累經驗。
有些東西沒有用過就是不知道會出現什麼問題,可能一點點的問題就會把時間托的很久,所以一定要把功底弄紮實,還要有靈活多變的應對策略,解決方案的思路和快速的思考能力是要有意識的培養才行。就是因為一個json字典轉換的編碼問題弄了好長時間。。。真需要多練習,加油。