在本篇博客中,我利用Python语言其编写界面库PyQt5,然后通过连接MySQL数据库,实现了一个简单的天气管理小系统,该系统包含简单的增删查改四个主要功能。本文旨在解析实现的程序,能够让读者快速了解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 "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的基本使用方法和数据库的基本语法,做起来还是比较得心应手的。
更多学习资料请关注专题《管理系统开发》。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】