9475| 0
|
[教程] 【Mind+Python】 人人都能学会的天气查询小助手 |
图 1 城市天气查询小城助手运行界面 图 2 城市天气查询小城助手运行界面 #项目起源# 进入11月,全国都经历了断崖式的降温,提前获取天气预报,做到防寒保暖显得十分重要,今天就来带大家通过Python 编程的方式制作一款查询天气状况的小程序 下面我们先通过动图来了看一下是如何通过Python 实现天气查询的 #动图展示# #程序设计# 编程思路 图 3 城市天气查询小城助手程序设计思维导图 准备工作 安装编程环境 编写Python程序之前我们需要先确定一下编程环境,可以用来编写Python程序的软件有很多种,我们这里列举几种常用的编程环境,第一种是Python官方提供的IDLE;第二种是简洁、轻量化的Thonny软件;第三种更适合青少年使用的Mind+图形化编程工具;第四种开源免费适合多种编程语言开发的VisualStudio Code;以及最后一种专业级收费的Pycharm 为了让更多人能够轻松上手编程,我们推荐使用前三种简单易入门的编程环境,三种编程环境使用方法大同小异,大家可以自由选择,我们本次使用Mind+图形化编程工具进行讲解 Python官方IDLE下载网站链接:www.python.org 图 4 Python官网 打开官方网站如图4所示,根据自己的电脑系统选择安装包并下载 Thonny编程环境下载链接:www.thonny.org Thonny官网打开后界面比较简洁,直接选择对应的电脑系统下载软件即可,如图5 图 5 Thonny 官网 Mind+图形化编程环境下载地址:mindplus.cc 图 6 mind+下载 电脑浏览器登录mind+网站,选择与自己电脑匹配的安装包下载,这里我们选择windows版本下载,如图6 软件下载完成后如图7所示,我们双击打开安装包 图 7 Mind+安装包 安装包打开后,在下图8显示的界面中点击“OK”按钮 图 8 安装mind+软件 之后会出现如下图9所示界面,点击“我同意”按钮 图 9 选择“我同意” 之后会在跳出如图10所示的安装页面,选择自己熟悉的安装路径,点击“安装”按钮进行安装 图 10 选择安装路径 然后我们等待安装完成 图 11 等待安装完成 安装成功,点击“完成”按钮会关闭窗口并运行mind+软件,也可以在桌面双击mind+图标打开软件 图 12软件安装完成 Mind+软件基本使用方法 Mind+图形化编程环境集成了多种编程模式,分别是实时的scratch模式,涉及多种开源硬件的上传模式以及Python模式,本次我们使用mind+软件的Python模式 图 13 mind+软件的Python模式 在软件中选择Python模式后,我们点击软件右侧文件目录,在“电脑中的文件”中添加文件,点击位置如下图14红色框所示 图 14 在mind+中添加本地文件 然后,我们在自己熟悉的路径下新建一个专门用来存放Python程序的文件夹并选中该文件夹后确定 图 15 选择文件夹 之后,我们点击新建文件,即可在当前文件夹下创建Python程序 我们给新建的文件取一个名字 图 16 命名文件 右击Python程序文件,选择在编辑区打开 图 17 在编辑区打开文件 之后,我们就可以在程序编辑区随心所欲的编程程序了 图 18 mind+Python模式界面布局 从上图中我们可以看出,Mind+编程环境可以分成三个区域,程序编辑区,文件编辑区以及终端也就是运行结果显示区。其中,在终端中我们也可以输入代码程序,比如输入“print(‘helllo world’)”,按下回车键后就会打印输出“hello world” 这就是我们通常所说的交互模式,所谓交互模式就是,输入一段指令就会返回一个结果 图 19 终端交互模式运行结果 如果要编写整段程序,我们需要在程序编辑区编辑代码,如下图20所示输入程序“print(‘hello,world’)”,运行后在运行结果显示区即可看到输出打印了“hello,world” 图 20 编译运行第一段程序 用来查看运行结果显示区的按钮在软件的右上角 图 21 运行按钮 点击“保存”按钮可以保存当前程序 图 22 保存文件 其实刚才我们打印输入的“hello world”是写程序时公认的第一段向世界问好的代码 其中指令“print()”是输出打印的意思,括号中可以填写变量或者带引号的字符串等内容 至此,我们已经掌握了mind+编写Python程序的基本使用方法 其实,Python的强大之处在于它可以调用很多的第三方库,不用再去重复造轮子,极大的提高了效率。 下面我们来学习一下如何使用mind+软件安装第三方库,在mind+软件的右上角点击库管理按钮,如下图23所示 图 23 安装第三方库 之后会看到如下界面,在推荐库一栏提供了大部分常用第三方库,可以一键安装,我们只需要点击“安装”按钮即可,安装完毕会看到“已安装”的提示字样,表明安装完成,比如我们点击“爬虫”分类库下面的requests库进行安装 图 24 安装第三方库 库列表中可以查看目前电脑中已经安装过的第三方库 图 25 已安装库列表 我们除了可以在推荐库一栏选择第三方库进行安装以外,还可以选择PIP模式安装第三方库 这里的PIP指的是一个 Python 第三方库的管理工具 ,你可以把它简单的理解为一个大管家,它可以实现对Python 库的查找、下载、安装、卸载等功能,比如安装一个requests库的指令是:“pip install requests”,卸载一个requests库的指令为:“pip uninstall requests”,关于PIP的其他用法大家可以自行查阅资料,这里不再展开叙述 图 26 在mind+中使用PIP安装第三方库 其实,我们刚才安装的这是一个第三方的网络请求库“requests”,它可以很轻松的发送HTTP网络请求,就像电脑浏览器那样,它是获取网络数据信息最常用的一个第三方库,也是本次天气查询需要用到的库。Python其他众多的第三方库安装方式大体类似,大家可以根据需求自行选择安装 “requests”安装完成后,我们可以在程序编辑界面输入如下程序来测试是否安装成功
程序运行后会看到如下图28所示结果,程序中通过“requests.get()”语句向百度API地址发送请求,程序运行后返回的原始数据为“Response[200]”,原始数据并不是我们想要的 我们可以将原始数据转换为json格式后再打印输出,实现的指令为“http_data.json()”。这样打印输出的就为标准的json格式数据了,得到json格式的数据就相当于我们已经拿到开启百宝箱的秘钥,至于这个json格式的秘钥如何使用我们在后面再详细介绍 图 28打印输出向百度请求的网络数据 我们还可以将程序简化,同样可以实现上述运行结果,程序如下
从图29中的运行结果可以看出,将多行程序精简为一行也可以实现效果,由此可以看出Python语言其实非常的灵活多变,多行程序容易理解,单行程序简洁效率高 图 29 输出输出向百度请求的网络数据 如果百度网站可以访问的话,接下来我们尝试访问一下天气网站 这里我们列举一些可以查询天气的网站,比如: 国内的有: 心知天气API https://www.seniverse.com/ 和风天气API http: //www.heweather.com/ 彩云天气API https://caiyunapp.com/ 国外的有: 各个网站有的收费,有的免费,使用的方法都大同小异,本次我们从中华万年历获取天气数据,API地址是: API地址中“city”后面需要添加查询城市的名称 我们只需要将访问百度网站程序中的API地址修改为天气查询的API地址即可,程序如下
运行结果如下图30所示 图 30 打印输出天气数据 从运行结果中,我们已经可以看到一些天气数据了,比如温度,日期等数据信息,如果我们修改程序中的城市名称即可查看其他城市的天气数据,相信你一定理解了,赶快去试试吧 拿到天气数据,接下来我们要做的就是从这些杂乱无序的数据中提取一些有用的信息显示出来,也就是我们现在要用这个Json格式的秘钥来打开百宝箱了 从返回的结果看,这样一堆数据难免让人有点头大,为了方便查看这些数据,我们可以将上述获取到的数据复制粘贴到“json.cn”这个网站中。这是一个专门用来解析Json格式数据的网站,下图31中右侧为数据整理解析后的结果 图 31 解析Json格式数据 我们在下图的json数据中做了注释,将有用的数据进行了标注,需要用到的数据有日期,最高温,风力,最低温,风向,天气状况以及感冒指数,而其中“类型说明”一项我们会在后面详细介绍 图 32 Json格式数据注释 接下来我们只需要将这些数据提取显示出来即可,通过观察我们发现日期、最高温、风力、最低温、风向、天气状况这6项数据是包含在“forecast”列表中的,而且包含了5天的数据,我们只需要通过“for”语句将这些数据遍历出来即可, 我们继续修改程序
图 33 提取Json格式数据中有用的信息 从图33的运行的结果我们可以看出,5天内我们需要的天气数据都提取出来了 程序中,我们除了将5天内的天气数据打印出来之外,在程序的最后我们还将感冒指数打印了出来 所有的数据拿到后,我们可以将现在的程序整理优化一下再进行下一步的学习 将请求天气网站的数据封装成函数“get_weather_data()”,将显示数据的的程序封装成函数“show_data()”,我们在调用显示数据函数“show_data()”时需要将“get_weather_data()”函数获取到的数据和城市名称“city_name”作为参数传入,修改后的程序如下所示:
想必细心观察的你一定发现了我们在函数“get_weather_data()”中增加了一个“if-else”条件判断语句,此段程序的作用是:当我们输入的城市名称正确时,正常输出显示天气状况,当我们输入的内容不符合要求或者是天气数据库中未包含该城市时将提示重新输入,而实现此功能我们就需要用到前文中Json格式秘钥里的“desc”类型说明数据,如果('desc') == 'invilad-citykey'则表示输入错误,需要重新输入,否则就可以正常显示。从反馈的结果我们也可以观察到通常情况下“desc”的内容为“ok”,也就是正常显示 到此为止,关于本次天气查询需要用到的所有网络请求数据的知识都已全部掌握,接下来我们需要设计一个实用美观的界面,让小程序看得高大上一些 下面,我们就使用Python自带的tkinter库来完成图形化界面的设计 使用Tkinter库设计图形化界面 什么是tkinter库呢 tkinter库是Python安装包自带的一个标准 GUI图形界面库。使用 tkinter 库可以快速的创建图形化的应用程序。 我们使用的 IDLE 编程环境和大名鼎鼎的turtle绘图程序就是用 tkinter 编写而成。对于简单的图形界面 tkinter 完全可以应付自如。 因为tkinter库是Python安装包自带的,所以我们可以直接使用,为了不增加难度,我们重新建一个新程序来学习使用tkinter库,基本用法掌握后再与天气查询的程序结合 tkinter调用方法如下:
在Python中调用tkinter库或者其他第三方库的方法有两种,两种方法在使用时有所区别,第一种方法是import tkinter,此方法在用到某种功能模块时需要加“tkinter.xxx”的前缀。而第二种方法是from tkinter import *,此方法在使用时不需要加前缀。两种方式各有优缺点,第一种方式在编程时会有一些繁琐,但当不同的库之间出现同名的模块时,因为有了前缀的区别就不会报错。第二种方式简单,不需要增加前缀,但在多个库同时使用时有可能会因为所使用的模块同名而出错。 第二种调用方法,就好比是用到的库里面包含的所有模块都搬上了餐桌,有些菜可能并不一定会吃到,但也占用了空间,而且因为是不同库提供的菜肴,有可能会出现同名的情况,这时程序运行时就会报错。 当然如果我们确定某次任务中只会用到一个库比如tkinter库,那就可以采用第二种简单的调用方法(就像一年当中自己一家三口吃饭的情况占绝大多数,菜品不会很多,也不会很占地方,也不会有重复的,这时候用简洁的调用方法不会出什么问题。而只有过年过节的时候才会出现亲朋好友一起吃一大桌子菜的情况,这时我们需要在各种有可能混淆的菜品前加前缀来进行区分) 因为此次本次天气查询的小程序我们确保只会用到tkinter和requests两个库,所以我们采用第二种调用方式 不过,有时候为了简化程序第一种调用方式还可以写成下面这种
也就是给“tkinter”起一个代号tk,这样编写程序时会变得比较方便了 关于导入库的方法理解后,我们开始利用tkinter库设计图形化界面 创建窗口
运行上述程序,会看到下图34所示的结果,在电脑屏幕中显示出了一个长900像素宽500像素的空白窗口 图 34 创建窗口 我们再来看刚才的程序,在窗口界面设置中,我们通过修改geometry()里的参数来调整窗口尺寸和显示的位置,具体修改方式如下
图 35 设置窗口大小及显示位置 设置Label标签 掌握了窗口的设置后,我们就可以在窗口中放置一些内容了,比如我们在窗口中增加一个Label标签,我们输入如下程序
程序运行后,我们会看到如下图36所示的运行结果,由Label标签设置的黄底绿字的几个汉字会显示在窗口上方 图 36 放置Label标签 仔细观察程序,我们可以通过修改Label中的文字内容,文字或背景颜色,字体和字体大小以及标签的尺寸来调整Label在窗口中的显示效果,如果不设置文字或背景颜色,则会默认为黑色文字白色背景 在程序的最后一行用到了l.pack(),这条语句的意思是将Label放置在窗口上,括号中没有输入任何内容,默认放置在窗口的顶部中间位置 如果要调整Label放置的位置,我们还可以在pack()的括号中设置位置参数。比如修改为如下参数,Label会显示在窗口的左边,如图37所示 pack(side='left') # 左 图 37 调整Label标签位置和尺寸 设置Label标签其余方位的指令如下,大家可以自行尝试调整查看运行的效果
其实,将Label或者其他组件放置在窗口中的方法不单单只有pack()一种,还有grid()和place()这两种 grid()布局 Grid() 是将窗口分成了若干行若干列的网格,所有的内容会被放在这些规律的网格中 我们可以将上述程序中的l.pack()修改为grid(),修改如下:
程序运行后会看到Label绘制在了窗口的左上角,也就是第0行第0列的位置,如下图38所示 图 38 使用grid()布局Label标签 观察运行结果再结合程序,我们会发现grid()中row和column分别表示行和列,修改行列的数值即可改变Label在窗口中显示的位置 其实,我们还可以在grid中设置每个单元格上下左右的间距,参数padx 就是单元格左右间距,pady 就是单元格上下间距,ipadx是单元格内部元素与单元格框架的左右间距,ipady是单元格内部元素与单元格框架的上下间距。 我们在程序中增加行列的设置,修改如下
运行程序后,你会发现与没有设置这些参数之前会有明显区别,Label并没有显示在左上角而是与上下左右边界有了10个像素的距离,并且由于设置了ipadx=5, ipady=5,Label的框明显变大了 图 39 使用grid()布局Label标签 除此之外,我们还可以在grid中增加sticky参数,这个参数可以用来调整要显示的元素显示在单元格的上下左右哪个方位,如果默认不填此参数则会显示在中间位置
讲到这里,我们其实大体上就可以把grid理解为Excel表格中单元格的处理方式,在Excel表格中单元格是可以合并的,在grid中单元格也可以合并,合并的指令包含行合并和列合并 行合并“rowspan=2”, 列合并“columnspan=2”, 关于单元格合并后的结果我们可以在后面的介绍中查看 place()布局 接下来我们介绍最后一种窗口部件放置的方式place(),它是给需要放置的组件精确的坐标定位,比如给Label坐标为(50, 100),就是将这个组件放在坐标为(x=50, y=100)的这个位置 我们将程序做如下修改就会看到如图40所示的结果,以窗口的左上角为坐标原点,Label标签会显示在x坐标为50,y坐标为100的位置
图 40 使用place()布局Label标签 掌握了三种窗口部件放置的方法后,我们就相当于拥有了绘图的工具,接下来就可以自由的放置需要的组件来设计丰富的图形化界面了 需要注意的是这三种窗口放置的方法是不可以混合使用的,本文我们使用第二种grid()方法来做主要讲解 以上,我们通过对Label组件的放置学习到了几种窗口布局的方法,除Label标签外本次天气查询小程序还会用到tkinter中的Button按钮和Entry输入栏,接下来我们学习Button按钮的使用方法 Button按钮放置 Button(按钮)部件是一个标准的Tkinter窗口部件,用来实现各种按钮。按钮能够包含文本或图像,并且你能够将按钮与一个Python函数或方法相关联。当这个按钮被按下时,tkinter自动调用相关联的函数或方法。 简言之,按钮部件用来让用户说“马上给我执行这个任务”,通常我们用显示在按钮上的文本或图像来提示。按钮通常用在工具条中或应用程序窗口中,并且用来接收或忽略输入在对话框中的数据 下面我们来设计一个按钮Button,在上述的程序中增加下面一段程序
程序运行后会看到如下图41所示结果,我们每点一次按钮就会打印输出“You hit me!” 在程序中,我们增加了Button按钮组件,其中text用来设置按钮上显示的文字,width、 height用来设置按钮的尺寸,command用来设置按钮被点击后执行的命令,在这里我们把它指向了一个函数“hit_me()”,每点击一次按钮就会打印输出相应内容 图 41 放置Button按钮 学会了一个Button按钮的放置方法,放置更多的Button按钮可以用同样的方法实现,大家可以自行尝试 Entry输入栏放置 最后,我们来学习一下Entry的用法 Entry是tkinter库中提供的的一个单行文本输入区域,用来输入显示一行文本,收集键盘输入 Entry顾名思义就是输入栏,用来让用户输入用户信息时,比如我们平时使用软件、登录网页时,用户交互界面让我们登录账户信息等时候可以用到 下面我们可以设计一个输入栏用来存放需要查询的天气的城市名称 我们继续在原有程序基础上增加下面这段程序
程序中,“delete”用来清空输入框,“insert”用来在输入框中添加文本 运行后会看到如下图42所示结果 图 42 放置Entry输入栏 到此为止,我们已经掌握了几个tkinter常用组件的使用方法,下面我们使用这几种组件来施展一下拳脚,制作一个可以显示天气的图形化界面 图 43 完善界面 实现上图43的运行结果,我们需要编写如下程序
程序中我们修改了原来的Label标签的字体颜色和背景颜色,在第1行第0列增加了一个新的Label标签,Entry输入栏放置在了第1行第1列,在第2行第2列增加了“退出”Button按钮,并且我们将原来“查询”按钮关联的“hit_me”函数修改为了前文中编写好的天气查询函数“get_weather_data()”,值得注意的是,在将图形化设置的程序与天气查询的程序合并时,需要将“requests”库导入,在程序的最后还增加了root.mainloop()语句,目的是让窗口循环运行 从运行结果可以发现,我们现在并没有将天气数据显示在图形化界面中,而是以输出打印的方式显示在了交互模式中,并且现在的界面略微显的有些单调,下面继续修改程序,将天气数据显示在图形化界面中并对外观界面进行美化 为了让天气数据显示在图形化窗口中,我们将“show_data()”函数做如下修改
运行上面的程序会看到如下图44所示的结果 图 44 将天气数据显示在图形化界面中 程序中,我们增加了一个“LabelFrame”,它是一个Label容器,如果将外层的主窗口算作一个大容器的话,“LabelFrame”就是一个大容器下的小容器,是一个专门用来存放Label标签的框架,可以将5天内的天气数据都放置在该容器中,这样我们就实现了将天气数据显示在窗口中,其中“LabelFrame”容器也可以像设置Label标签那样对容器添加标题和设置尺寸、位置 细心观察的你会发现,风力等级一项出现了一些不需要的符号,最高温最低温中出现了重复的高温低温,我们可以重新修改程序来改善这些细节
上面程序中,我们使用了“re.sub”语句,该语句的作用是将一些不需要的字符用空白内容代替,其实这个就是我们常用的正则表达式,当然在使用正则表达式时,我们需要导入该库,导入方法是:“import re” 图 45 修改天气数据显示的细节 这时候再观察运行结果,你会发现细节被修改了 可是有的伙伴难免会有疑问,现在只能查询北京的天气,其他城市的该如何查询呢 修改为任意城市天气查询,我们只需要将原先get_weather_data()函数中的语句city_name ='北京'替换为下面的语句即可
运行结果如图46所示,我们可以查询扬州的天气了 图 46 支持任意城市天气查询 目前看来,我们好像已经实现了预期的功能,不过还有提升的空间,还可以将界面进行美化一下。 能不能增加一些图片元素来美化外观呢,显然是可以的,不过这里需要强调的是tkinter库只支持gif格式的图片,我们可以使用电脑中自带的画图工具将其他格式的图片转变成gif格式 事先准备如下两张图片,并将其存放在与天气查询Python程序所在的文件夹中 图 47 准备图片 图 48 将图片和程序放在同一个文件中 图片准备好,我们就可以在程序中导入图片并显示了 导入图片的方法如下
运行后的结果如下图49 图 49 显示图片 我们点击查询按钮则会看到如图50的运行结果 图 50 显示图片 为了让程序更加清晰简洁,我们可以对程序进行进一步优化,将图形化界面布局的程序放置在主函数中 最后,我们还需要为“退出”按钮增加关联程序,以及为输入错误的城市名称增加提示程序,这时我们就需要用到tkinter库中的“messagebox”模块,“messagebox”顾名思义就是消息提示框,在使用它之前,我们需要导入该模块,导入方式为:from tkinter import messagebox关于messagebox有6种不同提示方式分别是
这里我们使用询问选择对话框,对程序做如下修改
修改后运行程序会看到如图51的效果 图 51 输入错误提示 这样我们离大功告成还差最后一步,那就是再设置一下与“退出”按钮关联的程序
其实,tkinter库中还有一条语句“root.quit”也可以执行退出指令 他们的区别是,root.quit会退出窗口界面,但还会执行窗口以外的其他程序,而root.destroy()则是终止运行所有程序,大家可以根据实际需求选择 不过,要提醒的是,切记在“退出”按钮Button中使用command = close语句将退出函数关联起来,退出提示如图52 图 52 退出提示 最后我们附上本次天气查询小助手的完整程序,当然此程序在其他编程环境同样适用,大家可以自行编译运
#总结# 至此,我们查询城市天气的小程序就全部完成了,我们学会了requests库的使用方法,可以简单的访问网络数据。掌握了tkinter库的基本使用方法,可以将网络请求的数据显示在窗口中。当我们学会了这两种库的使用后,就可以做一些更加有趣的作品了,比如查询疫情数据,查询电影评分等等,如果再结合数据统计分析能做的事情就更多了,相信你会有更加精彩的创意,赶快去试试吧 更多精彩内容请关注旺仔爸爸造物社 程序下载 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed