本文使用python3.8,pycharm Community Edition 2020,pyqt5,示范天气查询系统界面的制作过程
一、安装PyQt5
pip install pyqt5
pip install pyqt5-tools
其中pyqt5-tools为Qt Designer拖拽式的界面设计工具
二、使用Qt Designer设计一个界面
![](https://img-blog.csdnimg.cn/img_convert/7e499be35cfbbdd8a47a8304802e1d93.png)
使用External Tools – PyUIC,即可生成Weather.py,实际运行命令如下:
C:\Users\Administrator\AppData\Local\Programs\Python\Python38-32\Scripts\pyuic5.exe Ui_Main.ui -o Ui_Main.py
其中,我们需要把两个按钮绑定的槽函数:
self.queryBtn.clicked.connect(self.queryWeather)
self.clearBtn.clicked.connect(self.clearText)
最终的Ui_Main.py内容如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'Ui_Main.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(409, 380)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setGeometry(QtCore.QRect(0, 0, 401, 351))
self.groupBox.setObjectName("groupBox")
self.label = QtWidgets.QLabel(self.groupBox)
self.label.setGeometry(QtCore.QRect(30, 30, 51, 16))
self.label.setObjectName("label")
self.comboBox = QtWidgets.QComboBox(self.groupBox)
self.comboBox.setGeometry(QtCore.QRect(70, 30, 69, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.clearBtn = QtWidgets.QPushButton(self.groupBox)
self.clearBtn.setGeometry(QtCore.QRect(30, 280, 75, 23))
self.clearBtn.setObjectName("clearBtn")
self.queryBtn = QtWidgets.QPushButton(self.groupBox)
self.queryBtn.setGeometry(QtCore.QRect(290, 280, 75, 23))
self.queryBtn.setObjectName("queryBtn")
self.now_btn = QtWidgets.QPushButton(self.groupBox)
self.now_btn.setGeometry(QtCore.QRect(280, 20, 75, 23))
self.now_btn.setObjectName("now_btn")
self.textEdit = QtWidgets.QTextEdit(self.groupBox)
self.textEdit.setGeometry(QtCore.QRect(20, 60, 371, 191))
self.textEdit.setObjectName("textEdit")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 409, 23))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "主页面"))
self.groupBox.setTitle(_translate("MainWindow", "城市天气查询"))
self.label.setText(_translate("MainWindow", "城市:"))
self.comboBox.setItemText(0, _translate("MainWindow", "北京"))
self.comboBox.setItemText(1, _translate("MainWindow", "苏州"))
self.comboBox.setItemText(2, _translate("MainWindow", "上海"))
self.comboBox.setItemText(3, _translate("MainWindow", "福州"))
self.clearBtn.setText(_translate("MainWindow", "清空"))
self.queryBtn.setText(_translate("MainWindow", "查询"))
self.now_btn.setText(_translate("MainWindow", "点点点"))
三、调用MainDialog
在MainDialog中调用界面类ManageUI,然后在其中中添加查询天气的业务逻辑代码,这样就做到了界面显示和业务逻辑的分离。创建weathermain.py, 在ManageUI类中定义了两个槽函数queryWeather()和clearText(),以便在界面文件Weather.ui中定义的两个按钮(queryBtn 和clearBtn) 触发clicked 信号与这两个槽函数进行绑定。
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
# from Ui_MainWindow import *
from Ui_Main import Ui_MainWindow
from Ui_caculate import Ui_caculate
from Ui_defect1 import Ui_defect1
from Ui_now import Ui_now
import requests
class ManageUI(QMainWindow, Ui_MainWindow):
def __init__(self):
super(ManageUI, self).__init__()
# 将UI界面布局到ManageUI上;
self.setupUi(self)
self.queryBtn.clicked.connect(self.queryWeather)
self.clearBtn.clicked.connect(self.clearText)
self.now_btn.clicked.connect(self.now)
# 查询
def querydata(self):
cityName = self.comboBox.currentText()
cityCode = self.getCode(cityName)
r = requests.get(
"https://restapi.amap.com/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}".format(
cityCode))
if r.status_code == 200:
data = r.json()['lives'][0]
weatherMsg = '城市:{}\n天气:{}\n温度:{}\n风向:{}\n风力:{}\n湿度:{}\n发布时间:{}\n'.format(
data['city'],
data['weather'],
data['temperature'],
data['winddirection'],
data['windpower'],
data['humidity'],
data['reporttime'],
)
else:
weatherMsg = '天气查询失败,请稍后再试!'
self.textEdit.setText(weatherMsg)
# 清除
def cleardata(self):
self.main = clearPage()
self.main.show()
# self.close()
# 实时
def now(self):
self.main = nowPage()
self.main.show()
# self.close()
def queryWeather(self):
cityName = self.comboBox.currentText()
cityCode = self.getCode(cityName)
r = requests.get("https://restapi.amap.com/v3/weather/weatherInfo?key=f4fd5b287b6d7d51a3c60fee24e42002&city={}".format(cityCode))
if r.status_code == 200:
data = r.json()['lives'][0]
weatherMsg = '城市:{}\n天气:{}\n温度:{}\n风向:{}\n风力:{}\n湿度:{}\n发布时间:{}\n'.format(
data['city'],
data['weather'],
data['temperature'],
data['winddirection'],
data['windpower'],
data['humidity'],
data['reporttime'],
)
else:
weatherMsg = '天气查询失败,请稍后再试!'
self.textEdit.setText(weatherMsg)
def getCode(self, cityName):
cityDict = {"北京": "110000",
"苏州": "320500",
"福州": "350100",
"上海": "310000"}
return cityDict.get(cityName, '101010100')
def clearText(self):
self.textEdit.clear()
class queryPage(QMainWindow, Ui_caculate):
def __init__(self):
super(queryPage, self).__init__()
self.setupUi(self)
class clearPage(QMainWindow, Ui_defect1):
def __init__(self):
super(clearPage, self).__init__()
self.setupUi(self)
class nowPage(QMainWindow, Ui_now):
def __init__(self):
super(nowPage, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
weather = ManageUI()
weather.show()
sys.exit(app.exec_())
最终效果如下:
![](https://img-blog.csdnimg.cn/img_convert/8e5228569597ead01002a45020282760.png)