Python学习第九课(tk新元素,制作新界面)
让使用更简单,是程序存在的理由。
上一节课我们完成了一个自动爬取全省天气的脚本。
那么在本节课中,结合上一节学习的思路,我们应该给程序加上界面了。
虽然经过上一节双色球彩票程序的学习内容来看,可视化界面可以通过各种控件来实现规范用户操作的能力,并且让使用更加简单。
那么这节课,我们就来实现一个可以爬取指定市区天气的可视化程序。
基础知识
考虑到城市的选择不能采取滑轨的形式,所以我们能联想到最直接的就是下拉菜单,在html语言中是select标签。那么在tkinter库中,它是:
Combobox:实现下拉菜单
可以通过设置 ‘value’ 来设定下拉菜单的内容
还可以通过 .current() 方法来设置默认选项,默认选择第一个就填写0即可。
初步尝试
上节课我们已经把各个不同模块都封装到了不同的方法中,在这一节课中,首先要做的是把上节课的显示部分也封装到方法里,然后制作一个简单的界面。
因为是在上节课基础上做界面,那么我们先还是实现查询一个省的所有天气,考虑到要显示多行数据,那么我们这使用一个可显示多行信息的组件:
Listbox:显示多行信息,通过 .insert() 方法添加要显示的信息。
由于改造部分不多,所以直接贴上源码,各位同学可以打开两个页面做代码对比:
#encoding: utf-8
from urllib import request
from urllib import parse
import json
from tkinter import *
from tkinter import ttk
#数据爬虫
def getData(Request_URL):
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",
}
req = request.Request(url = Request_URL, headers = header)
res = request.urlopen(req)
str_json = res.read().decode('utf-8')
myjson = json.loads(str_json)
return(myjson['data'])
#分隔城市及编号信息
def Separate_data(bigList):
answerList = {
}
tempList = bigList.split('|')
for i in range(0, len(tempList)):
bh, name = tempList[i].split(',')
answerList.update({
name : bh})
return(answerList)
#主运行程序
def runThis():
#生成要查询的城市列表
new_URL = Request_URL_China + "/" + cityList[topCombobox.get()]
alist = Separate_data(getData(new_URL))
#遍历查询每个城市的天气信息
for i in (alist):
weather_Data = []
weather_URL = "https://weather.cma.cn/api/now/" + alist[i]
weather_Data = getData(weather_URL)
wea = weather_Data['location']['path']
wea += "\n温度:" + str(weather_Data['now']['temperature'])
wea += "\n风:" + weather_Data['now']['windDirection'] + weather_Data['now']['windScale']
if len(weather_Data['alarm'])