PyQt5 開發 民航票務管理系統
這份 Java 是我的實驗的:《小型MIS的開發》— Spring + Mybatis + JavaFx 開發 民航票務管理系統
下面這份 Python 版是幫女朋友寫的!
爲什麼要拿 Python 做呢?
這兩天正好在下大雨,昨天我把自己的軟件 + 報告寫完後,準備開始幫女朋友寫,原本打算在我的代碼的基礎上改改 UI 和 邏輯什麼的,就可以搞定了;這是原計劃,畢竟用 JavaFx 開發確實是效率高啊!
但是昨天的大雨讓我沒法去自習室。。。我的考研相關的書都在自習室,既然只能呆在宿舍。。那不如學點新東西把,於是我選擇了 Python + Qt 製作圖形化界面,就當增加一下自己的技術棧。。
學習一天的知識點
如果是真心的想學習一下的話,可以看看這幾篇文章,這些是我將這個項目要用到的知識點模塊化記錄了一下:
首先是 PyQt5 的 安裝 與 入門教程:【PyQt5】PyQt5 安裝 以及使用 designer 開發 python GUI 界面
然後是安裝時可能遇到的問題:PyQt5: This application failed to start because it could not find or load the Qt platform plugin
完成上面的 安裝 與 入門 以後可以正式開始寫我們這個項目了;
然後需要了解的是 頁面跳轉 相關的知識:【PyQt5】designer 頁面點擊按鈕跳轉頁面
瞭解這個以後,就可以完整的搭建出一個完整的 包含點擊按鈕進行跳轉的 界面了;但是此時界面上是沒有數據的,因此下一步需要學習的是 Python 連接數據庫 相關知識:【PyQt5】PyMySQL 連接 MySQL數據庫
學會與數據庫打交道以後,我們只要再學一個 PyQt5 的組件——tableWidget 就可以完成我們這次實驗了:【PyQt5】連接 mysql 查詢數據 並顯示在 tableWidget 表格
以上是如果你想靠自己的實力完成這次實驗需要掌握的知識點。
開發環境 與 項目整體結構
我的開發環境是:
- PyQt 5
- Python 3.8
- VsCode
- MySQL 5.7
項目整體結構:
ui 目錄下存放 .ui
文件,這個是由 qt designer 設計出來的界面文件,我們可以通過 pyuic5 將它們轉化爲 Python 代碼,所以 hello.ui
—> hello.py
、login.ui
—> login.py
、operate.ui
—> operate.py
,一一對應。
順帶一提,代碼的編譯運行 是不需要 .ui
文件的,只有當你想要修改界面時候,纔會去動他。
至於 app.py
,那就是我們的核心邏輯文件了,如果想要看懂這裏的東西就需要去學習上面列出的知識點啦!
數據庫建表
需要兩張表:
- 用戶表 user
- 航班信息表 flight
命令行登錄 MySQL:
mysql -u root -p1
> 輸入密碼: 1234
建立一個數據庫:sxn210224
,並進入:
CREATE DATABASE sxn210224;
USE sxn210224;
下面開始建表:
用戶表的 SQL
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`u_id` varchar(8) NOT NULL,
`u_username` varchar(50) DEFAULT NULL,
`u_password` varchar(50) DEFAULT NULL,
PRIMARY KEY (`u_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('17210224', 'luzhenyu', '123456');
INSERT INTO `user` VALUES ('17210309', 'hanlei', '123456');
航班信息表的 SQL
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for flight
-- ----------------------------
DROP TABLE IF EXISTS `flight`;
CREATE TABLE `flight` (
`f_id` char(8) NOT NULL,
`f_src` varchar(15) DEFAULT NULL,
`f_des` varchar(15) DEFAULT NULL,
`f_date` date NOT NULL,
`f_start_time` char(6) DEFAULT NULL,
`f_end_time` char(6) DEFAULT NULL,
`f_remain_seats` int(4) DEFAULT NULL,
`f_fares` float(8,0) DEFAULT NULL,
`f_discount_nums` float(8,0) DEFAULT NULL,
`f_discount` float(8,0) DEFAULT NULL,
`f_subordinate_company` varchar(20) DEFAULT NULL,
PRIMARY KEY (`f_id`,`f_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of flight
-- ----------------------------
INSERT INTO `flight` VALUES ('F001', '揚州', '蘇州', '2012-12-12', '15:30', '14:20', '5', '99', '5', '1', '振宇有限公司');
INSERT INTO `flight` VALUES ('F002', '揚州', '蘇州', '2012-12-13', '12:20', '15:50', '20', '99', '5', '1', '振宇有限公司');
INSERT INTO `flight` VALUES ('F003', '揚州', '北京', '2012-12-13', '12:20', '17:50', '4', '99', '5', '1', '振宇有限公司');
INSERT INTO `flight` VALUES ('F004', '揚州', '泰國', '2012-12-13', '7:20', '8:50', '2', '99', '5', '1', '振宇有限公司');
INSERT INTO `flight` VALUES ('F005', '揚州', '廣州', '2012-12-14', '5:20', '14:50', '40', '99', '5', '1', '振宇有限公司');
界面代碼
注意,我們的界面都是通過 Qt designer 拖拽製作的 .ui
文件,再通過 pyuic5 工具轉爲 .py
文件
簡單起見,總共就只有三個界面文件:
- 主界面
hello.py
- 登陸界面
login.py
- 操作界面
operate.py
主界面:hello.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(510, 300)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_3.setObjectName("gridLayout_3")
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.label = QtWidgets.QLabel(self.centralwidget)
font = QtGui.QFont()
font.setPointSize(22)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setContentsMargins(-1, -1, -1, 15)
self.gridLayout.setHorizontalSpacing(10)
self.gridLayout.setVerticalSpacing(15)
self.gridLayout.setObjectName("gridLayout")
self.queryButton = QtWidgets.QPushButton(self.centralwidget)
self.queryButton.setMinimumSize(QtCore.QSize(250, 40))
self.queryButton.setMaximumSize(QtCore.QSize(250, 40))
self.queryButton.setObjectName("queryButton")
self.gridLayout.addWidget(self.queryButton, 1, 0, 1, 1)
self.manageButton = QtWidgets.QPushButton(self.centralwidget)
self.manageButton.setMinimumSize(QtCore.QSize(250, 40))
self.manageButton.setMaximumSize(QtCore.QSize(250, 40))
self.manageButton.setObjectName("manageButton")
self.gridLayout.addWidget(self.manageButton, 0, 0, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1)
self.gridLayout_3.addLayout(self.gridLayout_2, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "主界面"))
self.label.setText(_translate("MainWindow", "歡迎使用票務管理系統"))
self.queryButton.setText(_translate("MainWindow", "票務查詢"))
self.manageButton.setText(_translate("MainWindow", "票務管理"))
登錄界面:login.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(510, 290)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.label = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(25)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setContentsMargins(-1, -1, -1, 15)
self.gridLayout.setSpacing(20)
self.gridLayout.setObjectName("gridLayout")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 0, 0, 1, 1)
self.userText = QtWidgets.QLineEdit(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.userText.sizePolicy().hasHeightForWidth())
self.userText.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
self.userText.setFont(font)
self.userText.setAlignment(QtCore.Qt.AlignCenter)
self.userText.setObjectName("userText")
self.gridLayout.addWidget(self.userText, 0, 1, 1, 1)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
self.label_3.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
self.pwdText = QtWidgets.QLineEdit(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pwdText.sizePolicy().hasHeightForWidth())
self.pwdText.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
self.pwdText.setFont(font)
self.pwdText.setAlignment(QtCore.Qt.AlignCenter)
self.pwdText.setObjectName("pwdText")
self.gridLayout.addWidget(self.pwdText, 1, 1, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 1, 0, 1, 1)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setContentsMargins(-1, -1, -1, 12)
self.horizontalLayout.setSpacing(20)
self.horizontalLayout.setObjectName("horizontalLayout")
self.okButton = QtWidgets.QPushButton(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.okButton.sizePolicy().hasHeightForWidth())
self.okButton.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
self.okButton.setFont(font)
self.okButton.setObjectName("okButton")
self.horizontalLayout.addWidget(self.okButton)
self.cancelButton = QtWidgets.QPushButton(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.cancelButton.sizePolicy().hasHeightForWidth())
self.cancelButton.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(12)
self.cancelButton.setFont(font)
self.cancelButton.setObjectName("cancelButton")
self.horizontalLayout.addWidget(self.cancelButton)
self.gridLayout_2.addLayout(self.horizontalLayout, 2, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", " 登陸界面"))
self.label.setText(_translate("MainWindow", "請輸入用戶信息"))
self.label_2.setText(_translate("MainWindow", "用戶名"))
self.label_3.setText(_translate("MainWindow", "密碼"))
self.okButton.setText(_translate("MainWindow", "確定"))
self.cancelButton.setText(_translate("MainWindow", "取消"))
操作界面:operate.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(750, 460)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(0, 90, 731, 161))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(11)
self.tableWidget.setRowCount(9)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(10, item)
self.layoutWidget = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget.setGeometry(QtCore.QRect(100, 380, 208, 35))
self.layoutWidget.setObjectName("layoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.layoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(20)
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton = QtWidgets.QPushButton(self.layoutWidget)
font = QtGui.QFont()
font.setPointSize(13)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.exitButton = QtWidgets.QPushButton(self.layoutWidget)
font = QtGui.QFont()
font.setPointSize(13)
self.exitButton.setFont(font)
self.exitButton.setObjectName("exitButton")
self.horizontalLayout.addWidget(self.exitButton)
self.layoutWidget1 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget1.setGeometry(QtCore.QRect(50, 290, 241, 74))
self.layoutWidget1.setObjectName("layoutWidget1")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget1)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setSpacing(20)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label = QtWidgets.QLabel(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(15)
self.label.setFont(font)
self.label.setObjectName("label")
self.horizontalLayout_3.addWidget(self.label)
self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(15)
self.lineEdit.setFont(font)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout_3.addWidget(self.lineEdit)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setSpacing(20)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(15)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.dateEdit = QtWidgets.QDateEdit(self.layoutWidget1)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.dateEdit.sizePolicy().hasHeightForWidth())
self.dateEdit.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(13)
self.dateEdit.setFont(font)
self.dateEdit.setObjectName("dateEdit")
self.horizontalLayout_2.addWidget(self.dateEdit)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.layoutWidget2 = QtWidgets.QWidget(self.centralwidget)
self.layoutWidget2.setGeometry(QtCore.QRect(200, 40, 321, 41))
self.layoutWidget2.setObjectName("layoutWidget2")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.layoutWidget2)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setSpacing(20)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.pushButton_3 = QtWidgets.QPushButton(self.layoutWidget2)
self.pushButton_3.setObjectName("pushButton_3")
self.horizontalLayout_4.addWidget(self.pushButton_3)
self.pushButton_4 = QtWidgets.QPushButton(self.layoutWidget2)
self.pushButton_4.setObjectName("pushButton_4")
self.horizontalLayout_4.addWidget(self.pushButton_4)
self.pushButton_5 = QtWidgets.QPushButton(self.layoutWidget2)
self.pushButton_5.setObjectName("pushButton_5")
self.horizontalLayout_4.addWidget(self.pushButton_5)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "操作界面"))
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget.verticalHeaderItem(1)
item.setText(_translate("MainWindow", "2"))
item = self.tableWidget.verticalHeaderItem(2)
item.setText(_translate("MainWindow", "3"))
item = self.tableWidget.verticalHeaderItem(3)
item.setText(_translate("MainWindow", "4"))
item = self.tableWidget.verticalHeaderItem(4)
item.setText(_translate("MainWindow", "5"))
item = self.tableWidget.verticalHeaderItem(5)
item.setText(_translate("MainWindow", "6"))
item = self.tableWidget.verticalHeaderItem(6)
item.setText(_translate("MainWindow", "7"))
item = self.tableWidget.verticalHeaderItem(7)
item.setText(_translate("MainWindow", "8"))
item = self.tableWidget.verticalHeaderItem(8)
item.setText(_translate("MainWindow", "9"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "航班號"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "起點"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "終點"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "日期"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "起飛時刻"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "到達時刻"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "票價"))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(_translate("MainWindow", "折扣票數"))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(_translate("MainWindow", "剩餘座位數"))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(_translate("MainWindow", "折扣率"))
item = self.tableWidget.horizontalHeaderItem(10)
item.setText(_translate("MainWindow", "航班所屬航空公司"))
self.pushButton.setText(_translate("MainWindow", "查詢"))
self.exitButton.setText(_translate("MainWindow", "退出"))
self.label.setText(_translate("MainWindow", "航班號"))
self.label_2.setText(_translate("MainWindow", "日期"))
self.pushButton_3.setText(_translate("MainWindow", "增加"))
self.pushButton_4.setText(_translate("MainWindow", "修改"))
self.pushButton_5.setText(_translate("MainWindow", "刪除"))
邏輯代碼 app.py
將以上的界面代碼 與 下面的邏輯代碼放在一個文件下就可以運行啦!(需要 PyQt 環境)
環境安裝可以看這個:【PyQt5】PyQt5 安裝 以及使用 designer 開發 python GUI 界面
import sys
from PyQt5 import QtCore, QtWidgets, QtCore
import pymysql
from hello import Ui_MainWindow as Hello_Ui
from login import Ui_MainWindow as Login_Ui
from operate import Ui_MainWindow as Operate_Ui
# 主窗口
class HelloWindow(QtWidgets.QMainWindow, Hello_Ui):
switch_window1 = QtCore.pyqtSignal()
switch_window2 = QtCore.pyqtSignal()
def __init__(self):
super(HelloWindow, self).__init__()
self.setupUi(self)
self.queryButton.clicked.connect(self.goOperate)
self.manageButton.clicked.connect(self.goLogin)
def goLogin(self):
self.switch_window1.emit()
def goOperate(self):
self.switch_window2.emit()
# 登錄窗口
class LoginWindow(QtWidgets.QMainWindow, Login_Ui):
switch_window1 = QtCore.pyqtSignal()
switch_window2 = QtCore.pyqtSignal()
def __init__(self):
super(LoginWindow, self).__init__()
self.setupUi(self)
self.okButton.clicked.connect(self.ok)
self.cancelButton.clicked.connect(self.cancel)
def ok(self):
username = self.userText.text()
password = self.pwdText.text()
# 創建數據庫連接
conn = pymysql.connect(
host = '127.0.0.1', # 連接主機, 默認127.0.0.1
user = 'root', # 用戶名
passwd = '1234', # 密碼
port = 3306, # 端口,默認爲3306
db = 'sxn210224', # 數據庫名稱
charset = 'utf8' # 字符編碼
)
# 生成遊標對象 cursor
cursor = conn.cursor()
if (cursor.execute("SELECT * FROM user WHERE u_username='%s' AND u_password='%s'" %(username, password))):
self.switch_window1.emit()
else:
print("密碼錯誤!!")
cursor.close()
conn.close()
def cancel(self):
self.switch_window2.emit()
# 操作窗口
class OperateWindow(QtWidgets.QMainWindow, Operate_Ui):
def __init__(self):
super(OperateWindow, self).__init__()
self.setupUi(self)
self.exitButton.clicked.connect(self.exit)
# 數據庫連接對象
conn = pymysql.connect(host='localhost', port=3306, user='root', password="1234", db="sxn210224")
# 遊標對象
cur = conn.cursor()
# 查詢的sql語句
sql = "SELECT * FROM flight"
cur.execute(sql)
# 獲取查詢到的數據, 是以二維元組的形式存儲的, 所以讀取需要使用 data[i][j] 下標定位
data = cur.fetchall()
# 打印測試
print(data)
# 遍歷二維元組, 將 id 和 name 顯示到界面表格上
x = 0
for i in data:
y = 0
for j in i:
self.tableWidget.setItem(x, y, QtWidgets.QTableWidgetItem(str(data[x][y])))
y = y + 1
x = x + 1
cur.close()
conn.close()
def exit(self):
sys.exit(0)
# 利用一個控制器來控制頁面的跳轉
class Controller:
def __init__(self):
self.hello = HelloWindow()
self.login = LoginWindow()
self.operate = OperateWindow()
def show_hello(self):
self.hello = HelloWindow()
self.hello.switch_window1.connect(self.show_login)
self.hello.switch_window2.connect(self.show_operate)
self.hello.show()
self.login.close()
self.operate.close()
def show_login(self):
self.login = LoginWindow()
self.login.switch_window1.connect(self.show_operate)
self.login.switch_window2.connect(self.show_hello)
self.login.show()
self.hello.close()
self.operate.close()
def show_operate(self):
self.operate = OperateWindow()
self.operate.show()
self.hello.close()
self.login.close()
def main():
app = QtWidgets.QApplication(sys.argv)
controller = Controller()
controller.show_hello()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
項目演示