返回顶部

[Python] PyQt5实践《做一个天气预报的查询》内附源码

[复制链接]
awagink 显示全部楼层 发表于 2021-1-3 15:23:44 |阅读模式 打印 上一主题 下一主题
第一步: 设计界面,我们这里直接用Qtdesign设计。

01.png

                             为了大家比较容易设置,我们这里在把对象查看器中的内容贴出来

02.png

                              简单的几个组件:一个窗口+两个按钮+一个下拉是的盒子+一个标签+一个返回文本显示的内容

第二步:将ui文件转换为py文件
  •        pyuic  -o  WeatherWin.py  WeatherWin.ui

  下面是转换后的py文件

  1. # -*- coding: utf-8 -*-

  2. # Form implementation generated from reading ui file 'WeatherWin.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.11.3
  5. #
  6. # WARNING! All changes made in this file will be lost!

  7. from PyQt5 import QtCore, QtGui, QtWidgets

  8. class Ui_Form(object):
  9.     def setupUi(self, Form):
  10.         Form.setObjectName("Form")
  11.         Form.resize(554, 396)
  12.         self.clearBtn = QtWidgets.QPushButton(Form)
  13.         self.clearBtn.setGeometry(QtCore.QRect(320, 320, 75, 23))
  14.         self.clearBtn.setObjectName("clearBtn")
  15.         self.groupBox = QtWidgets.QGroupBox(Form)
  16.         self.groupBox.setGeometry(QtCore.QRect(60, 30, 421, 251))
  17.         self.groupBox.setObjectName("groupBox")
  18.         self.label = QtWidgets.QLabel(self.groupBox)
  19.         self.label.setGeometry(QtCore.QRect(80, 39, 51, 21))
  20.         self.label.setObjectName("label")
  21.         self.weatherComboBox = QtWidgets.QComboBox(self.groupBox)
  22.         self.weatherComboBox.setGeometry(QtCore.QRect(140, 40, 221, 22))
  23.         self.weatherComboBox.setObjectName("weatherComboBox")
  24.         self.weatherComboBox.addItem("")
  25.         self.weatherComboBox.addItem("")
  26.         self.weatherComboBox.addItem("")
  27.         self.weatherComboBox.addItem("")
  28.         self.resultText = QtWidgets.QTextEdit(self.groupBox)
  29.         self.resultText.setGeometry(QtCore.QRect(70, 100, 291, 131))
  30.         self.resultText.setObjectName("resultText")
  31.         self.queryBtn = QtWidgets.QPushButton(Form)
  32.         self.queryBtn.setGeometry(QtCore.QRect(150, 320, 75, 23))
  33.         self.queryBtn.setObjectName("queryBtn")

  34.         self.retranslateUi(Form)

  35.         QtCore.QMetaObject.connectSlotsByName(Form)

  36.     def retranslateUi(self, Form):
  37.         _translate = QtCore.QCoreApplication.translate
  38.         Form.setWindowTitle(_translate("Form", "Form"))
  39.         self.clearBtn.setText(_translate("Form", "清空"))
  40.         self.groupBox.setTitle(_translate("Form", "查询城市天气"))
  41.         self.label.setText(_translate("Form", "城市"))
  42.         self.weatherComboBox.setItemText(0, _translate("Form", "北京"))
  43.         self.weatherComboBox.setItemText(1, _translate("Form", "西安"))
  44.         self.weatherComboBox.setItemText(2, _translate("Form", "上海"))
  45.         self.weatherComboBox.setItemText(3, _translate("Form", "天津"))
  46.         self.queryBtn.setText(_translate("Form", "查询"))
复制代码

第三步: 数据传递

      第二步只是将界面绘制了出来并转换为py文件,接着我们会使用requests模块对网站发起请求,获取我们想要的数据,并显示到我们的窗口中。

     首先我们试着访问一下该网址:http://www.weather.com.cn/data/sk/101010100.html  这个查的是北京的天气,是一个json格式的数据,而且还乱码了,没关系,我们等会改成utf-8就好了。 每个城市之间只是那红色的城市代码不同。 我这里只找了北京,天津,西安,上海的城市代码。所以只能查这些地区。。  如果想找你所在的城市,去网上找一下。

03.png

            这是我在网上随便找的。

           我们可以构造查询了连接,然后用requests进行请求。 返回json格式的数据,我们一步一步提取出来就可以了。 下面是调用的文件。

  1. import sys
  2. from PyQt5.QtWidgets import *
  3. from WeatherWin import Ui_Form
  4. import requests

  5. class MainWindow(QMainWindow):
  6.     def __init__(self, parent=None):
  7.         super(MainWindow, self).__init__(parent)
  8.         self.ui = Ui_Form()
  9.         self.ui.setupUi(self)

  10.         self.ui.clearBtn.clicked.connect(self.clearResult)
  11.         self.ui.queryBtn.clicked.connect(self.queryWeather)
  12.     def queryWeather(self):

  13.         print('* queryWeather')
  14.         cityName = self.ui.weatherComboBox.currentText()
  15.         cityCode = self.transCityName(cityName)
  16.         web = 'http://www.weather.com.cn/data/sk/' + cityCode + '.html'
  17.         rep = requests.get(web)
  18.         rep.encoding = 'utf-8'
  19.         # print(rep.json())

  20.         msg1 = '城市: %s' % rep.json()['weatherinfo']['city'] + '\n'
  21.         msg2 = '风向: %s' % rep.json()['weatherinfo']['WD'] + '\n'
  22.         msg3 = '温度: %s' % rep.json()['weatherinfo']['temp'] + '\n'
  23.         msg4 = '风力: %s' % rep.json()['weatherinfo']['WS'] + '\n' + '度'
  24.         msg5 = '湿度: %s' % rep.json()['weatherinfo']['SD'] + '\n'
  25.         result = msg1 + msg2 + msg3 + msg4 + msg5
  26.         self.ui.resultText.setText(result)

  27.     def transCityName(self, cityName):
  28.         cityCode = ''

  29.         if cityName == '北京':
  30.             cityCode = '101010100'
  31.         elif cityName == '天津':
  32.             cityCode = '101030100'
  33.         elif cityName == '上海':
  34.             cityCode = '101020100'
  35.         elif cityName == '西安':
  36.             cityCode = '101110101'

  37.         return cityCode

  38.     def clearResult(self):
  39.         print('* clearResult')
  40.         self.ui.resultText.clear()

  41. if __name__ == '__main__':

  42.     app = QApplication(sys.argv)
  43.     win = MainWindow()
  44.     win.setObjectName("MainWindow")  # 为主窗口设置对象名 为了在下面设置背景颜色  
  45.     win.setStyleSheet("#MainWindow{border-image:url(./images/python.jpg);}")  # 这个图片路径是我自己的,你可以这一张你自己的图片。或者把这两行都给注释掉
  46.     win.show()
  47.     sys.exit(app.exec_())
复制代码

最后的界面:

   04.png

背景是乱加的。。 大家可以自己加好看的背景。

看一下功能

05.png

  有个下拉框  可以选择城市,然后点击查询就可以查到了。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

纳速健身网成立于2006年8月,是国内优秀健身运动网站,现拥浏览人数超30万。网站是集养生、武术、太极拳和健身气功等多种健身项目于一体的多功能交流平台。平台提供大量优质的教学视频、伴奏音乐(太极拳晨练音乐,广场舞音乐,健身气功音乐)、图文教程、运动科普和经验分享,为健身爱好者提供完善的运动指导平台。
  • 纳速QQ群乙:151815303
  • 纳速QQ群丙:79104490
  • 微信交流群:微信好友搜索【nasuwang】加小纳微信进群交流健身知识,备注【纳速】
  •                     或者扫描页面底部右侧二维码添加小纳微信>>>
  • 微信公众号

  • 微信群客服交流

  • Copyright © 2006-2021, 纳速健身网. | | 辽ICP备13002388号-1 辽公安网备21050202000005号公安网备号 纳速武术-乙 QQ