python 天气预报 mysql_Python+PyQt5+MySQL实现天气管理系统
在本篇博客中,我利用Python語(yǔ)言其編寫(xiě)界面庫(kù)PyQt5,然后通過(guò)連接MySQL數(shù)據(jù)庫(kù),實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的天氣管理小系統(tǒng),該系統(tǒng)包含簡(jiǎn)單的增刪查改四個(gè)主要功能。本文旨在解析實(shí)現(xiàn)的程序,能夠讓讀者快速了解PyQt5圖形界面庫(kù),然后可以初步實(shí)現(xiàn)這樣一個(gè)小的系統(tǒng)程序。
PyQt5簡(jiǎn)介
PyQt5本身來(lái)自C++的界面庫(kù)Qt,經(jīng)過(guò)一系列的封裝移植到Python里面,作為Python的一個(gè)圖像界面庫(kù),它繼承了Python語(yǔ)言簡(jiǎn)單易實(shí)現(xiàn)的特點(diǎn),可以實(shí)現(xiàn)基本的界面效果。里面有許多類(lèi)實(shí)現(xiàn)了我們想要的窗體、表格、文本、圖像等功能。在這個(gè)項(xiàng)目中也有所涉及,博主也是初次學(xué)這個(gè)庫(kù),然后寫(xiě)了這個(gè)小項(xiàng)目,里面可能會(huì)有一些不合適的地方,望諒解。
天氣系統(tǒng)數(shù)據(jù)庫(kù)
我將天氣系統(tǒng)數(shù)據(jù)存入MySQL數(shù)據(jù)庫(kù)中,提取數(shù)據(jù)時(shí)用Python的pymysql庫(kù)連接MySQL數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行一系列操作。
這個(gè)數(shù)據(jù)庫(kù)主要包含城市、時(shí)間、各個(gè)空氣物質(zhì)的含量、pm2.5、AQI指標(biāo)等。如果需要數(shù)據(jù)可以在下面留言,我可以發(fā)給你們。
實(shí)現(xiàn)步驟
導(dǎo)入所需要用的Python包:PyQt5,pymysql……沒(méi)有的可以直接用pip安裝
創(chuàng)建所要編寫(xiě)的界面類(lèi),初始化界面
連接數(shù)據(jù)庫(kù),獲取數(shù)據(jù)
建立表格、按鈕布局
實(shí)現(xiàn)功能函數(shù)
測(cè)試
具體實(shí)現(xiàn)過(guò)程
#導(dǎo)入包
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)
#建立界面類(lèi)
class creat_view(QDialog):
def __init__(self,parent = None):
super(creat_view,self).__init__(parent)
#設(shè)置界面大小、名稱(chēng)、背景
self.resize(1000,800)
self.setWindowTitle('Database')
self.setStyleSheet("background-image:url(tubiao_meitu.jpg)")
#窗體屬性
self.setWindowFlags(Qt.Widget)
#連接數(shù)據(jù)庫(kù)
db = pymysql.connect("localhost", "root", "password", "mysql",charset='utf8')
#獲取游標(biāo)、數(shù)據(jù)
cur = db.cursor()
cur.execute("SELECT * FROM pm_25")
data = cur.fetchall()
#數(shù)據(jù)列名
col_lst = [tup[0] for tup in cur.description]
#數(shù)據(jù)的大小
row = len(data)
vol = len(data[0])
#插入表格
self.MyTable = QTableWidget(row,vol)
font = QtGui.QFont('微軟雅黑',10)
#設(shè)置字體、表頭
self.MyTable.horizontalHeader().setFont(font)
self.MyTable.setHorizontalHeaderLabels(col_lst)
#設(shè)置豎直方向表頭不可見(jiàn)
self.MyTable.verticalHeader().setVisible(False)
self.MyTable.setFrameShape(QFrame.NoFrame)
#設(shè)置表格顏色 self.MyTable.horizontalHeader().setStyleSheet('QHeaderView::section{background:skyblue}')
#構(gòu)建表格插入數(shù)據(jù)
for i in range(row):
for j in range(vol):
temp_data = data[i][j] # 臨時(shí)記錄,不能直接插入表格
data1 = QTableWidgetItem(str(temp_data)) # 轉(zhuǎn)換后可插入表格
self.MyTable.setItem(i, j, data1)
#編輯按鈕
self.qle = QLineEdit()
buttonBox = QDialogButtonBox()
#增刪查改四個(gè)按鈕
addButton = buttonBox.addButton("&ADD",QDialogButtonBox.ActionRole)
okButton = buttonBox.addButton("&OK",QDialogButtonBox.ActionRole)
deleteButton = buttonBox.addButton("&DELETE",QDialogButtonBox.ActionRole)
inquireButton = buttonBox.addButton("&QUERY",QDialogButtonBox.ActionRole)
#設(shè)置按鈕內(nèi)字體樣式
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))#插入實(shí)現(xiàn)
okButton.clicked.connect(partial(self.up_data, cur, db,col_lst))#插入實(shí)現(xiàn)
deleteButton.clicked.connect(partial(self.del_data,cur,db))#刪除實(shí)現(xiàn)
inquireButton.clicked.connect(partial(self.inq_data,db))#查詢(xún)實(shí)現(xiàn)
#添加空表格
def add_data(self,cur,db):
#獲取行數(shù)
row = self.MyTable.rowCount()
#在末尾插入一空行
self.MyTable.insertRow(row)
#插入數(shù)據(jù)
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))
#插入語(yǔ)句
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):
#是否刪除的對(duì)話框
reply = QMessageBox.question(self, 'Message', 'Are you sure to delete it ?', QMessageBox.Yes | QMessageBox.No,
QMessageBox.No)
if reply == QMessageBox.Yes:
#當(dāng)前行
row_2 = self.MyTable.currentRow()
del_d = self.MyTable.item(row_2, 0).text()
#在數(shù)據(jù)庫(kù)刪除數(shù)據(jù)
cur.execute("DELETE FROM pm_25 WHERE f_id = '"+del_d+"'")
db.commit()
#刪除表格
self.MyTable.removeRow(row_2)
#查詢(xún)
def inq_data(self,db):
txt = self.qle.text()
#模糊查詢(xún)
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)
#查詢(xún)到的更新帶表格當(dāng)中
for i_x in range(row_4):
for j_y in range(vol_1):
temp_data_1 = data_x[i_x][j_y] # 臨時(shí)記錄,不能直接插入表格
data_1 = QTableWidgetItem(str(temp_data_1)) # 轉(zhuǎn)換后可插入表格
self.MyTable.setItem(i_x, j_y, data_1)
#空輸入返回原先數(shù)據(jù)表格
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] # 臨時(shí)記錄,不能直接插入表格
data_2 = QTableWidgetItem(str(temp_data_2)) # 轉(zhuǎn)換后可插入表格
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的基本使用方法和數(shù)據(jù)庫(kù)的基本語(yǔ)法,做起來(lái)還是比較得心應(yīng)手的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持python博客。
與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python 天气预报 mysql_Python+PyQt5+MySQL实现天气管理系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python离线安装flask_Linu
- 下一篇: python ndarray find_