PyQt5 开发 民航票务管理系统

  • 为什么要拿 Python 做呢?
  • 学习一天的知识点
  • 开发环境 与 项目整体结构
  • 数据库建表
    • 用户表的 SQL
    • 航班信息表的 SQL
  • 界面代码
    • 主界面:hello.py
    • 登录界面:login.py
    • 操作界面:operate.py
  • 逻辑代码 app.py
  • 项目演示

这份 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.pylogin.ui —> login.pyoperate.ui —> operate.py,一一对应。

顺带一提,代码的编译运行 是不需要 .ui 文件的,只有当你想要修改界面时候,才会去动他。

至于 app.py,那就是我们的核心逻辑文件了,如果想要看懂这里的东西就需要去学习上面列出的知识点啦!

数据库建表

需要两张表:

  • 用户表 user
  • 航班信息表 flight

命令行登录 MySQL:

mysql -u root -p
> 输入密码: 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, QtWidgetsclass 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.translateMainWindow.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, QtWidgetsclass 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.translateMainWindow.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, QtWidgetsclass 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.translateMainWindow.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 pymysqlfrom 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,        # 端口,默认为3306db = 'sxn210224',   # 数据库名称charset = 'utf8'    # 字符编码)# 生成游标对象 cursorcursor = 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 = 0for i in data:y = 0for j in i:self.tableWidget.setItem(x, y, QtWidgets.QTableWidgetItem(str(data[x][y])))y = y + 1x = x + 1cur.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()

项目演示



【数据库实验】《小型MIS的开发》PyQt5 开发 民航票务管理系统相关推荐

  1. 【数据库实验】《小型MIS的开发》— JavaFx 开发 民航票务管理系统

    <小型MIS的开发> 需求描述 数据库建表 用户表的 SQL 航班信息表的 SQL 项目演示 GitHub 网址获取源代码 比较重要的知识点 JavaFx 中 spring 工厂如何创建 ...

  2. 计算机毕业设计Java汽车客运站票务管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java汽车客运站票务管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java汽车客运站票务管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构 ...

  3. java计算机毕业设计汽车客运站票务管理系统源代码+数据库+系统+lw文档

    java计算机毕业设计汽车客运站票务管理系统源代码+数据库+系统+lw文档 java计算机毕业设计汽车客运站票务管理系统源代码+数据库+系统+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言: ...

  4. 用PyQt5开发可视化爬虫软件

    用PyQt5开发可视化爬虫软件 一些小伙伴知道怎么写爬虫,但是却不知道怎么给爬虫加上一个可视化操作界面,只是在IDE或者命令行窗口中运行py文件然后查看输出结果:而另一些可能知道怎么写简单的界面,但是 ...

  5. activiti 工作流_技术干货 | 金仓通用数据库中,如何使用Activiti快速开发工作流应用?...

    Activiti 是一个针对企业用户.开发人员 .系统管理员的轻量级工作流业务管理平台,可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言进行定义,业务系统将按照预先定义的流程进行执行,实现业 ...

  6. python软件包自带的集成开发环境-实验一 熟悉Python的集成开发环境

    实验一 熟悉Python的集成开发环境 一.实验目的与要求 1.了解什么是Python: 2.了解Python的特性: 3.掌握下载和安装Python的方法: 4.学习执行Python命令和脚本文件的 ...

  7. Hypersonic SQL开源数据库方向比较流行的纯Java开发的关系型数据库

    Hypersonic SQL Hypersonic SQL开源数据库方向比较流行的纯Java开发的关系型数据库.好像不是JDBC兼容的,JDBC的很多高级的特性都没有支持,不过幸好支持ANSI- 92 ...

  8. android碎片实验报告,《Android 移动应用开发》实验报告-范本78(29页)-原创力文档...

    实验1<Android活动的使用> 实验学时: 2 每组人数: 1 实验类型: 1 (1:基础性 2:综合性 3:设计性 4:研究性) 实验要求: 1 (1:必修 2:选修 3:其它) 实 ...

  9. openGauss数据库源码解析系列文章——openGauss开发快速入门(二)

    在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...

最新文章

  1. NVIDIA DGX SUPERPOD 企业解决方案
  2. COOKIE和SESSION关系和区别
  3. linux 脚本详解,shell脚本分析日志
  4. tpp letter
  5. STL源码剖析 序列式容器 slist
  6. 2021,国产数据库的躬行实践之年
  7. 天津消协警示“58同城” 请珍视消费者的信任和选择
  8. MPLS 次末跳弹出配置_weblogic的安装与配置
  9. java -jar命令
  10. 【C语言函数调用详解】——传值调用传址调用
  11. 通达2017OA数据字典
  12. 服务器装系统提示未找到任何驱动器,win7系统安装时提示找不到任何设备驱动程序的四种解决方法图文教程...
  13. zmud之潜能武学技能计算器。
  14. 百度关闭快照删除更新入口
  15. 给大家推荐一款超低功耗的4G低功耗摄像头方案强大的AI功能
  16. Linux 启动时,出现give root password for maintenance处理方法
  17. 【医学影像 | 个人记录】骨盆
  18. 分布式调度框架Elastic-Job
  19. iPhone浏览器会把类似手机号或者电话号的一串数字的样式字体改为灰色
  20. 计算机一级自动筛选怎么做,Excel自动筛选小技巧

热门文章

  1. 创业者如何更好地认知世界?
  2. 有钱人的学习能力,穷人该得好好模仿
  3. 路由器隔一段时间就上不了网,断一下电又能用了,这是什么原因?
  4. Linux环境下编程有哪些优势?
  5. 2021 年高教社杯全国大学生数学建模竞赛题目(C 题 生产企业原材料的订购与运输)
  6. QFileInfoList
  7. Java-数字相关类
  8. sql server复制表_具有超过246列的表SQL Server复制
  9. azure blob_如何在Azure Blob存储中恢复意外删除
  10. 什么是SQL Server数据库镜像?