【數據庫實驗】《小型MIS的開發》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.pylogin.ui —> login.pyoperate.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()

項目演示

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章