Python结合PyQt5与MySQL构建简易天气管理系统

沈知远
沈知远
发布时间:2026-10-14| 4人浏览过
原创

本文详细介绍如何使用Python语言、PyQt5界面库及MySQL数据库,开发一个具备增删查改功能的简易天气管理系统。文章涵盖环境配置、数据库连接、界面布局及核心功能实现,旨在帮助读者快速掌握PyQt5基础应用及数据库交互技巧。

系统概述与目标

本文介绍如何利用Python语言及其界面库PyQt5,结合MySQL数据库,构建一个具备基础增删查改功能的简易天气管理系统。文章旨在解析程序实现逻辑,帮助读者快速理解PyQt5图形界面库的使用方法,并能够独立开发此类小型系统。

PyQt5库简介

PyQt5简介

PyQt5源自C++的Qt界面库,经封装移植至Python环境,作为Python的图形界面库,它保留了Python语言简洁易用的特性,可实现基础界面效果。该库包含多种类,用于实现窗体、表格、文本及图像等功能。本项目涉及其中部分功能,由于作者初次使用该库,代码中可能存在不足之处,敬请谅解。

数据库设计与连接

天气系统数据库

天气系统数据存储于MySQL数据库中,通过Python的pymysql库连接MySQL数据库,对数据库执行各类操作以提取和处理数据。

该数据库主要包含城市名称、时间、各空气物质含量、PM2.5数值及AQI指标等信息。如需相关数据,可在评论区留言,作者将提供发送。

系统实现步骤

实现步骤

  • 导入所需的Python包,包括PyQt5和pymysql等,若未安装可直接通过pip进行安装。
  • 创建需要编写的界面类,并完成界面初始化。
  • 连接数据库,并获取相关数据。
  • 建立表格及按钮布局。
  • 实现各项功能函数。
  • 进行系统测试。

具体实现过程

核心代码实现


#导入包
import pymysql
from functools import partial
from PyQt5.Qt import QWidget
from PyQt5 import QtGui,QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QFrame,QApplication,QDialog, QDialogButtonBox,
 QMessageBox,QVBoxLayout, QLineEdit,QTableWidgetItem,QTableWidget,QHBoxLayout)

#建立界面类
class creat_view(QDialog):
 def __init__(self,parent = None):
 super(creat_view,self).__init__(parent)

 #设置界面大小、名称、背景
 self.resize(1000,800)
 self.setWindowTitle('Database')
 self.setStyleSheet("background-image:url(tubiao_meitu.jpg)")

 #窗体属性
 self.setWindowFlags(Qt.Widget)


 #连接数据库
 db = pymysql.connect("localhost", "root", "password", "mysql",charset='utf8')
 #获取游标、数据
 cur = db.cursor()
 cur.execute("SELECT * FROM pm_25")
 data = cur.fetchall()

 #数据列名
 col_lst = [tup[0] for tup in cur.description]

 #数据的大小
 row = len(data)
 vol = len(data[0])


 #插入表格
 self.MyTable = QTableWidget(row,vol)
 font = QtGui.QFont('微软雅黑',10)

 #设置字体、表头
 self.MyTable.horizontalHeader().setFont(font)
 self.MyTable.setHorizontalHeaderLabels(col_lst)
 #设置竖直方向表头不可见
 self.MyTable.verticalHeader().setVisible(False)
 self.MyTable.setFrameShape(QFrame.NoFrame)
#设置表格颜色 self.MyTable.horizontalHeader().setStyleSheet('QHeaderView::section{background:skyblue}')

 #构建表格插入数据
 for i in range(row):
 for j in range(vol):
 temp_data = data[i][j] # 临时记录,不能直接插入表格
 data1 = QTableWidgetItem(str(temp_data)) # 转换后可插入表格
 self.MyTable.setItem(i, j, data1)


 #编辑按钮
 self.qle = QLineEdit()
 buttonBox = QDialogButtonBox()
 #增删查改四个按钮
 addButton = buttonBox.addButton("&ADD",QDialogButtonBox.ActionRole)
 okButton = buttonBox.addButton("&OK",QDialogButtonBox.ActionRole)
 deleteButton = buttonBox.addButton("&DELETE",QDialogButtonBox.ActionRole)
 inquireButton = buttonBox.addButton("&QUERY",QDialogButtonBox.ActionRole)

 #设置按钮内字体样式
 addButton.setFont(font)
 okButton.setFont(font)
 deleteButton.setFont(font)
 inquireButton.setFont(font)

 #垂直布局
 layout = QVBoxLayout()
 layout.addWidget(self.qle)
 layout.addWidget(buttonBox)
 layout.addWidget(self.MyTable)
 self.setLayout(layout)

 addButton.clicked.connect(partial(self.add_data,cur,db))#插入实现
 okButton.clicked.connect(partial(self.up_data, cur, db,col_lst))#插入实现
 deleteButton.clicked.connect(partial(self.del_data,cur,db))#删除实现
 inquireButton.clicked.connect(partial(self.inq_data,db))#查询实现

 #添加空表格
 def add_data(self,cur,db):
 #获取行数
 row = self.MyTable.rowCount()
 #在末尾插入一空行
 self.MyTable.insertRow(row)


 #插入数据
 def up_data(self,cur,db,col_lst):
 row_1 = self.MyTable.rowCount()

 value_lst = []
 for i in range(len(col_lst)):
 if(len(self.MyTable.item(row_1-1,i).text())==0):
 value_lst.append(None)
 else:
 value_lst.append(self.MyTable.item(row_1-1,i).text())

 tup_va_lst = []
 for cl,va in zip(col_lst,value_lst):
 tup_va_lst.append((cl,va))

 #插入语句
 cur.execute(
 "INSERT INTO pm_25 VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)",value_lst)



 #删除
 def del_data(self,cur,db):
 #是否删除的对话框
 reply = QMessageBox.question(self, 'Message', 'Are you sure to delete it ?', QMessageBox.Yes | QMessageBox.No,
   QMessageBox.No)
 if reply == QMessageBox.Yes:
 #当前行
 row_2 = self.MyTable.currentRow()
 del_d = self.MyTable.item(row_2, 0).text()

 #在数据库删除数据
 cur.execute("DELETE FROM pm_25 WHERE f_id = '"+del_d+"'")
 db.commit()

 #删除表格
 self.MyTable.removeRow(row_2)

 #查询
 def inq_data(self,db):
 txt = self.qle.text()

 #模糊查询
 if len(txt) != 0:
 cur.execute("SELECT * FROM pm25_fn WHERE f_area LIKE '%"+txt+"%' or f_place LIKE '%"+txt+"%'")# CONCAT('f_id','f_area','f_place','f_AQI','f_AQItype','f_PM25per1h'),concat(concat('%','#txt'),'%')

 data_x = cur.fetchall()

 self.MyTable.clearContents()

 row_4 = len(data_x)
 vol_1 = len(cur.description)

 #查询到的更新带表格当中
 for i_x in range(row_4):
 for j_y in range(vol_1):
  temp_data_1 = data_x[i_x][j_y] # 临时记录,不能直接插入表格
  data_1 = QTableWidgetItem(str(temp_data_1)) # 转换后可插入表格
  self.MyTable.setItem(i_x, j_y, data_1)

 #空输入返回原先数据表格
 else:
 self.MyTable.clearContents()
 cur.execute("SELECT * FROM pm_25")
 data_y = cur.fetchall()

 row_5 = len(data_y)
 vol_1 = len(cur.description)

 for i_x_1 in range(row_5):
 for j_y_1 in range(vol_1):
  temp_data_2 = data_y[i_x_1][j_y_1] # 临时记录,不能直接插入表格
  data_2 = QTableWidgetItem(str(temp_data_2)) # 转换后可插入表格
  self.MyTable.setItem(i_x_1, j_y_1, data_2)

def main():
 #显示
 app = QApplication(sys.argv)

 c = creat_view()
 c.show()

 sys.exit(app.exec_())

main()

界面展示与总结

界面展示

总体而言,只要掌握PyQt的基本使用方法和数据库的基本语法,开发此类系统相对容易上手。

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对读者的学习有所帮助,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。