- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python制作的天气预报小工具(gui界面)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
不需要准备.
启动以后自动定位所在城市,展示定位城市的天气.
添加天气之后能够显示多个城市天气信息.
用此流程图展示定位城市信息到获取城市天气信息过程.
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=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()}当前所在地区:{city}当前气温:{item["now"]}感冒指数:{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()}当前所在地区:{city}当前气温:{item["now"]}感冒指数:{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()
#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=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 天气预报工具的资料请关注我其它相关文章! 。
原文链接:https://blog.csdn.net/a1397852386/article/details/116947547 。
最后此篇关于python制作的天气预报小工具(gui界面)的文章就讲到这里了,如果你想了解更多关于python制作的天气预报小工具(gui界面)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有谁知道在给定顶点列表的情况下以编程方式创建冷/暖锋矢量的方法(注意顶点不包含小三 Angular 形或半圆;[-105W,40.45N]等...)? 我正在尝试在网络 map 应用程序上放置“当前前
在 iOS 天气应用程序的右下角,有一个表格/列表图标。我想知道这是一个栏按钮项目,还是一个自定义图标。 最佳答案 这是一个带有自定义图标的自定义按钮。要查找来自 Apple 的所有模板图标,请转到
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
很多用户为了提高自己的工作效率,都会在电脑桌面上添加日历,天气,时钟等小工具,防止忘记一些重要的事项。那如何在win10系统桌面添加日历,天气,时钟等小工具呢?下面就跟着小编一起来看看吧。 Win
我试图使用 NOAA 进行每小时预报,但它不允许我输入东经。请求必须是西经。 他们甚至为印度等亚洲国家提供东经服务。 这是我使用的链接 http://graphical.weather.gov/xml
我正在使用 pywapi 来获取不同地点的天气状况。我使用的命令是: alaska = pywapi.get_weather_from_noaa('PABI') 其中“PABI”是阿拉斯加的电台 ID
我目前正在使用 xCode 开发一个应用程序,我是 iOS 新手。我的天气格式当前正在向我的数据库提交“摄氏度”和“华氏度”,而不是发送 C 或 F。我已经尝试了几件事,但看起来它也将我的显示文本更改
我在一些地方看到人们正在寻找天气应用程序效果。这些问题中有很多是针对 Android 应用程序或 JAVA 的,但我正在寻找在 HTML/CSS/Javascript 网站上的使用。这可能吗? 当您查
我正在使用雅虎! Weather RSS Feed 以获取我所在城镇的预报。我可以解析 XML 并获取天气描述,但随后我得到如下结果: Current Conditions: Light Rain,
这个问题已经有答案了: How can I access and process nested objects, arrays, or JSON? (31 个回答) 已关闭 6 年前。 所以,我正在尝
我正在使用 SAX 从 google 天气 API 中提取信息,但我遇到了“条件”问题。 具体来说,我正在使用这段代码: public void startElement (String uri, S
我正在使用一个简单的 Web API 来获取伦敦城市的天气详细信息。但是,我没有得到所需的响应,而是收到 401 错误。我做错了什么吗? HTML $(document).ready(func
我正在使用 Open Weather API,但是当我发送城市数据请求时,出现网络错误。 这是获取资源的操作。 actions/index.js import axios from "axios";
这段代码中的所有内容我都在尝试为用户提供本地的位置和温度但是不知何故温度以摄氏度显示的方式更少而且下面也没有更新是我尝试过的就像它是 4-5 小时回溯数据到 10 度摄氏度不太像如果温度是 22(摄氏
我正在尝试使用 CLLocation 来捕获经度和纬度,然后使用 Alamofire 中的经度和纬度来获取天气。每次,经度和纬度都不会停止更新,也不会打印天气数据(如果你想查看这里是数据的示例链接:h
fullfillment page至于我个人的兴趣,我想使用天气 api 制作一个天气聊天机器人。为此,我使用对话流,但是当我按照 Dialogflow github 进行 webhook 连接时但出
我正在开发一款应用程序,我相信它会对学生有所帮助。我想根据位置包括天气(仅温度)。例如,如果我要从一个城市前往另一个城市,我希望它能针对新城市自动更新。我该怎么做?对于我的第二个问题,我还想将日期(即
有谁知道如何制作像天气/新闻应用程序中的 Nexus One 选项卡这样的选项卡,我的意思是通过轻弹屏幕即可转到下一个选项卡的功能,谢谢 视频:http://www.youtube.com/watch
我正在尝试制作一个天气应用程序。到目前为止,我设法从 rss 中获得了一些基本信息。我正在使用以下代码: if ([currentElement isEqualToString:@"descr
我有一个由站点标识符代码(“usaf”)和日期组织的表面天气观测数据框(fzraHrObs)。 fzraHrObs 有几列天气数据。车站代码和日期(日期时间对象)如下所示: usaf dat
我是一名优秀的程序员,十分优秀!