

pyqt5-教程系列(十二)PyQt5使用http请求获取天气
source link: https://xushanxiang.com/2019/08/pyqt5-tutorial-series-12-pyqt5-use-http-request-to-get-weather.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

pyqt5-教程系列(十二)PyQt5使用http请求获取天气
刚才讲了用PyQt5写一个俄罗斯方块的游戏,接下来再说一下如何利用Pyqt5来获取天气预报信息。 这里获取数据是从中国天气官方网址获取。
本案例是采用的获取天气的服务器接口为:
http://wthrcdn.etouch.cn/weather_mini,请求参数名为city,参数内容为要查询天气的城市名称(utf8字符串)。请求方式为GET。
使用QT调用天气接口则需要用到网络类,通过HTTP请求数据。
构造构造图形界面 widget.py 文件
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Widget(object):
def setupUi(self, Widget):
Widget.setObjectName("Widget")
Widget.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Widget)
self.pushButton.setGeometry(QtCore.QRect(300, 40, 75, 23))
self.pushButton.setObjectName("pushButton")
self.textBrowser = QtWidgets.QTextBrowser(Widget)
self.textBrowser.setGeometry(QtCore.QRect(20, 10, 256, 161))
self.textBrowser.setObjectName("textBrowser")
self.formLayoutWidget = QtWidgets.QWidget(Widget)
self.formLayoutWidget.setGeometry(QtCore.QRect(50, 179, 160, 111))
self.formLayoutWidget.setObjectName("formLayoutWidget")
self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
self.formLayout.setContentsMargins(11, 11, 11, 11)
self.formLayout.setSpacing(6)
self.formLayout.setObjectName("formLayout")
self.label = QtWidgets.QLabel(self.formLayoutWidget)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
self.lineEdit = QtWidgets.QLineEdit(self.formLayoutWidget)
self.lineEdit.setObjectName("lineEdit")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
self.label_2 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_2.setObjectName("label_2")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
self.lineEdit_2 = QtWidgets.QLineEdit(self.formLayoutWidget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
self.label_3 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_3.setObjectName("label_3")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_3)
self.lineEdit_3 = QtWidgets.QLineEdit(self.formLayoutWidget)
self.lineEdit_3.setObjectName("lineEdit_3")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.lineEdit_3)
self.label_4 = QtWidgets.QLabel(self.formLayoutWidget)
self.label_4.setObjectName("label_4")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_4)
self.lineEdit_4 = QtWidgets.QLineEdit(self.formLayoutWidget)
self.lineEdit_4.setObjectName("lineEdit_4")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.lineEdit_4)
self.retranslateUi(Widget)
QtCore.QMetaObject.connectSlotsByName(Widget)
def retranslateUi(self, Widget):
_translate = QtCore.QCoreApplication.translate
Widget.setWindowTitle(_translate("Widget", "Widget"))
self.pushButton.setText(_translate("Widget", "获取天气"))
self.label.setText(_translate("Widget", "城市"))
self.label_2.setText(_translate("Widget", "天气"))
self.label_3.setText(_translate("Widget", "温度"))
self.label_4.setText(_translate("Widget", "风力"))
上面的文件是构造构造图形界面。
爬取天气预报信息 weather.py
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtNetwork import *
import widget
import sys
class MyWeather(QWidget):
def __init__(self, parent = None):
super().__init__(parent)
self.mywidget = widget.Ui_Widget()
self.mywidget.setupUi(self)
self.manager = QNetworkAccessManager(self)
self.manager.finished.connect(self.replyFinished)
self.mywidget.pushButton.clicked.connect(self.request)
def replyFinished(self, reply):
str1 = reply.readAll()
str2 = bytes.decode(str1.data(),encoding='utf8')
self.mywidget.textBrowser.setText(str2)
err = QJsonParseError()
json_recev = QJsonDocument.fromJson(str1,err)
if not json_recev.isNull():
myobject = json_recev.object()
if 'data' in myobject:
myvalue = myobject['data']
if myvalue.isObject():
myobject_data = myvalue.toObject()
if 'forecast' in myobject_data:
value = myobject_data['forecast']
if value.isArray():
value1 = value.toArray()[0].toObject()
self.tianqi = value1['type'].toString()
self.mywidget.lineEdit_2.setText(self.tianqi)
low = value1['low'].toString()
high = value1['high'].toString()
self.wendu = low[2:] + '-' + high[2:]
self.mywidget.lineEdit_3.setText(self.wendu)
fengxiang = value1['fengxiang'].toString()
fengli = value1['fengli'].toString()
self.fengli = fengxiang + fengli[9:-3]
self.mywidget.lineEdit_4.setText(self.fengli)
reply.deleteLater()
def request(self):
city = self.mywidget.lineEdit.text() #str
pre = 'http://wthrcdn.etouch.cn/weather_mini?city='
res = pre + city
print(res)
url = QUrl(res)
self.manager.get(QNetworkRequest(url))
if __name__ == '__main__':
app = QApplication(sys.argv)
weather = MyWeather()
weather.show()
sys.exit(app.exec_())
请求天气数据
def request(self):
city = self.mywidget.lineEdit.text() #str
pre = 'http://wthrcdn.etouch.cn/weather_mini?city='
res = pre + city
print(res)
url = QUrl(res)
self.manager.get(QNetworkRequest(url))
回复数据处理槽函数:
def replyFinished(self, reply):
str1 = reply.readAll()
str2 = bytes.decode(str1.data(),encoding='utf8')
self.mywidget.textBrowser.setText(str2)
err = QJsonParseError()
json_recev = QJsonDocument.fromJson(str1,err)
if not json_recev.isNull():
myobject = json_recev.object()
if 'data' in myobject:
myvalue = myobject['data']
if myvalue.isObject():
myobject_data = myvalue.toObject()
if 'forecast' in myobject_data:
value = myobject_data['forecast']
if value.isArray():
value1 = value.toArray()[0].toObject()
self.tianqi = value1['type'].toString()
self.mywidget.lineEdit_2.setText(self.tianqi)
low = value1['low'].toString()
high = value1['high'].toString()
self.wendu = low[2:] + '-' + high[2:]
self.mywidget.lineEdit_3.setText(self.wendu)
fengxiang = value1['fengxiang'].toString()
fengli = value1['fengli'].toString()
self.fengli = fengxiang + fengli[9:-3]
self.mywidget.lineEdit_4.setText(self.fengli)
reply.deleteLater()
天气请求回复的JSON数据中含有多天的详细天气信息,但在此只解析了当天的天气状态、温度和风力三个参数信息,以供参考,Demo程序演示效果如下。
源码地址:
https://github.com/liuyu007/pyQt/tree/master/Desktop/tq
Recommend
-
59
Hello,各位小伙伴大家好,我是小栈君。上一期我们讲到了关于函数的有参、无参、匿名函数,本期我们分享一下关于go语言函数类型、匿名函数和闭包的概念和实战。闲话不多说,立马开始分享。 在Go语言中,函数也是一种数据类型,我...
-
15
请求转发一般的原因为: 1. 该请求自身无法处理,需要转发给对应的服务器处理; 2. 为实现负载均衡,使用路由服务,选择目标实例进行转发; 在集群模式下,请求可以打到任何一台redis服务器上。然而并不是所有的服务器都会处理真...
-
19
爬虫过程中,几乎都会遇到post提交方式和get提交方式。传的参数也是有很多方式。现在具体介绍一下post和get区别。 最普通的答案 我一直就觉得GET和POST没有什么除了语义之外的区别,自打我开始学习Web编程开始就是这么理解的 。
-
5
强烈推荐系列教程,建议学起来!! 十万字pyt...
-
7
上一篇记录了gin框架的搭建与路由的基本使用,本文主要记录一下路由处理过程中的参数传递问题,包含GET与POST传参,以及路径参数的使用。 GET 参数的获取 get 请求的参数写在url 中, 如 http://xxxx.com/path?id=1234&name=Manu&...
-
13
使用触屏路由器无法获取到天气,路由器屏幕上提示“未能获取网...
-
3
kettle通过Webservice获取天气信息 精选 原创 雍州无名 2022-10-14 14:39:49
-
2
一、注册天气获取账号 我使用的知心天气,没有获取天气账号的小伙伴可以去注册一下,知心天气官网:https://www.seniverse.com/ 取得天气获取的API后,可以直接在...
-
3
STM32天气数据获取 硬件资源ESP8266无线上网模块、STM32系统板、OLED屏 实现方式ESP8266无线上网模块配置为STA+TCPClinet;通讯协议:
-
5
手把手教会你 “毛玻璃质感”天气卡片动效-经验/观点-UICN用户体验设计平台 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK