在本篇博客中,我利用Python語(yǔ)言其編寫界面庫(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)基本的界面效果。里面有許多類實(shí)現(xiàn)了我們想要的窗體、表格、文本、圖像等功能。在這個(gè)項(xiàng)目中也有所涉及,博主也是初次學(xué)這個(gè)庫(kù),然后寫了這個(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)建所要編寫的界面類,初始化界面
- 連接數(shù)據(jù)庫(kù),獲取數(shù)據(jù)
- 建立表格、按鈕布局
- 實(shí)現(xiàn)功能函數(shù)
- 測(cè)試
具體實(shí)現(xiàn)過(guò)程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
#導(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) #建立界面類 class creat_view(QDialog): def __init__( self ,parent = None ): super (creat_view, self ).__init__(parent) #設(shè)置界面大小、名稱、背景 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)) #查詢實(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) #查詢 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) #查詢到的更新帶表格當(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í)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/qq_40707407/article/details/81814482