Python+PyQt5+MySQL实现天气管理系统


Posted in Python onJune 16, 2020

在本篇博客中,我利用Python语言其编写界面库PyQt5,然后通过连接MySQL数据库,实现了一个简单的天气管理小系统,该系统包含简单的增删查改四个主要功能。本文旨在解析实现的程序,能够让读者快速了解PyQt5图形界面库,然后可以初步实现这样一个小的系统程序。

PyQt5简介

PyQt5本身来自C++的界面库Qt,经过一系列的封装移植到Python里面,作为Python的一个图像界面库,它继承了Python语言简单易实现的特点,可以实现基本的界面效果。里面有许多类实现了我们想要的窗体、表格、文本、图像等功能。在这个项目中也有所涉及,博主也是初次学这个库,然后写了这个小项目,里面可能会有一些不合适的地方,望谅解。

天气系统数据库

我将天气系统数据存入MySQL数据库中,提取数据时用Python的pymysql库连接MySQL数据库,对数据库进行一系列操作。

这个数据库主要包含城市、时间、各个空气物质的含量、pm2.5、AQI指标等。如果需要数据可以在下面留言,我可以发给你们。

Python+PyQt5+MySQL实现天气管理系统

实现步骤

  • 导入所需要用的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()

界面展示

Python+PyQt5+MySQL实现天气管理系统

大致就这么多啦,只要掌握PyQt的基本使用方法和数据库的基本语法,做起来还是比较得心应手的。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 字符串中的字符倒转
Sep 06 Python
python中import学习备忘笔记
Jan 24 Python
浅谈function(函数)中的动态参数
Apr 30 Python
python的unittest测试类代码实例
Dec 07 Python
Python对List中的元素排序的方法
Apr 01 Python
python装饰器常见使用方法分析
Jun 26 Python
python过滤中英文标点符号的实例代码
Jul 15 Python
详解Python打包分发工具setuptools
Aug 05 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
Pytorch在NLP中的简单应用详解
Jan 08 Python
Python实现SMTP邮件发送
Jun 16 #Python
python语言中有算法吗
Jun 16 #Python
python爬虫可以爬什么
Jun 16 #Python
通过cmd进入python的步骤
Jun 16 #Python
解决Keras 自定义层时遇到版本的问题
Jun 16 #Python
Keras实现支持masking的Flatten层代码
Jun 16 #Python
Keras自定义实现带masking的meanpooling层方式
Jun 16 #Python
You might like
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
快速配置PHPMyAdmin方法
2008/06/05 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
php数组去重的函数代码
2013/02/03 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
JS截取url中问号后面参数的值信息
2014/04/29 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
js实现支持手机滑动切换的轮播图片效果实例
2015/04/29 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
Django发送邮件功能实例详解
2019/09/02 Python
对python中各个response的使用说明
2020/03/28 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
CSS3实现DIV圆角效果完整代码
2012/10/10 HTML / CSS
CSS3 绘制BMW logo实的现代码
2013/04/25 HTML / CSS
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
Shop Apotheke瑞士:您的健康与美容网上商店
2019/10/09 全球购物
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
如何写一个自定义标签
2012/12/28 面试题
儿子婚宴答谢词
2014/01/09 职场文书
计算机网络工程专业职业生涯规划书
2014/03/10 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
董存瑞观后感
2015/06/11 职场文书
优秀团员主要事迹材料
2015/11/05 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python