1. 程式人生 > 其它 >pyqt5圖書管理系統--3、管理員頁面設計

pyqt5圖書管理系統--3、管理員頁面設計

本節主要分為兩個部分;一個為管理員介面設計,另一個為新增書籍介面。

主要流程:1、通過進入管理員介面,設定三個按鈕(新增書籍、使用者管理、淘汰書籍);

     2、當管理員點選新增書籍,即轉到新增書籍介面;

       3、新增書籍介面顯示出可操作的標籤輸入框和按鈕,進行新增相應書籍資訊;

     4、對比新增的資訊進行相應設定和提示;

       5、連線資料庫,將所獲取的輸入框文字內容新增進資料庫,並更新新增書籍的相應資訊。

一、管理員介面

  • 模組:
import sys
from PyQt5.QtWidgets import *
import qdarkstyle
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
from addBookDialog import addBookDialog

(一)類基礎

class AdminHome(QWidget):
    def __init__(self):
        super(AdminHome, self).__init__()
        self.setUpUi()

(二)頁面佈局

1、介面基礎佈局

self.resize(900,600)
self.setWindowTitle("歡迎進入管理員主頁")
self.layout = QHBoxLayout()
self.buttonlayout = QVBoxLayout()
self.setLayout(self.layout)

2、新增標籤

self.userManageButton = QPushButton("使用者管理")
self.addBookButton = QPushButton("新增書籍")
self.dropBookButton = QPushButton("淘汰書籍")

3、設定字型

font = QFont()
font.setPixelSize(16)
self.userManageButton.setFont(font)
self.addBookButton.setFont(font)
self.dropBookButton.setFont(font)

4、設定寬高

self.userManageButton.setFixedWidth(100)
self.userManageButton.setFixedHeight(42)
self.addBookButton.setFixedWidth(100)
self.addBookButton.setFixedHeight(42)
self.dropBookButton.setFixedWidth(100)
self.dropBookButton.setFixedHeight(42)

5、新增至垂直佈局

self.buttonlayout.addWidget(self.addBookButton)
self.buttonlayout.addWidget(self.userManageButton)
self.buttonlayout.addWidget(self.dropBookButton)
# 將以上三個按鈕佈局新增到垂直佈局中
self.layout.addLayout(self.buttonlayout)

(三)傳送訊號

self.addBookButton.clicked.connect(self.addBookButtonClicked)
  • 通過傳送的訊號呼叫模組函式。
from addBookDialog import addBookDialog
  • 啟動新視窗呼叫新增書籍介面對話方塊。
def addBookButtonClicked(self):
    addDialog = addBookDialog()
    addDialog.show()
    addDialog.exec_()

二、新增書籍介面

  • 模組:
import sys
from PyQt5.QtWidgets import *
import qdarkstyle
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
import time

(一)類基礎設定

class addBookDialog(QDialog):
    接受訊號
    add_book_success_sign = pyqtSignal()
    def __init__(self):
        super(addBookDialog,self).__init__()
        self.setWindowModality(Qt.WindowModal)
        self.setWindowTitle("新增書籍")
        self.setUpUI()

(二)新增書籍介面佈局

1、頁面大小布局

self.resize(300,400)
self.layout = QFormLayout()
self.setLayout(self.layout)

2、新增書籍的標籤及大小

(1)新增書籍標籤

self.titleLabel = QLabel("新增書籍")
self.bookNameLabel = QLabel("書 名:")
self.bookIdLabel = QLabel("書 號:")
self.authNameLabel = QLabel("作 者:")
self.categoryLabel = QLabel("分 類:")
self.publisherLabel = QLabel("出 版 社:")
self.publisherDateLabel = QLabel("出版日期:")
self.addNameLabel = QLabel("數 量:")
​
# 新增的按鈕標籤
self.addBookButton = QPushButton("新增")

(2)設定書籍標籤字型的大小

# 設定驗證
font = QFont()
font.setPixelSize(20)
self.titleLabel.setFont(font)
font.setPixelSize(14)
self.bookNameLabel.setFont(font)
self.bookIdLabel.setFont(font)
self.authNameLabel.setFont(font)
self.categoryLabel.setFont(font)
self.publisherLabel.setFont(font)
self.publisherDateLabel.setFont(font)
self.addNameLabel.setFont(font)

(3)設定按鈕大小

# 設定button
font.setPixelSize(16)
self.addBookButton.setFont(font)
self.addBookButton.setFixedHeight(32)
self.addBookButton.setFixedWidth(140)

3、新增相對應的輸入框

  • 選項輸入框型別
  BookCategory = ["哲學","教育","生物學","社會科學","政治", "法律","軍事","經濟","文化","體育","語言文字","地理","天文學","醫療衛生","農業"]
# lineEdit控制元件
self.bookNameEdit = QLineEdit()
self.bookIdEdit = QLineEdit()
self.authNameEdit = QLineEdit()
# 分類建立的QComboBox,儲存整個分類的列表
# QComboBox 以佔用最少螢幕控制元件的方式向用戶呈現選項列表的方法
self.categoryEdit = QComboBox()
​
self.categoryEdit.addItems(BookCategory)
self.publisherEdit = QLineEdit()
​
# QDateTime 時間控制元件
# setDisplayFormat 設定顯示的格式 yyyy-MM-dd 年-月-日
self.publisherTime = QDateTimeEdit()
self.publisherTime.setDisplayFormat("yyyy-MM-dd")
self.addNumEdit = QLineEdit()

4、設定輸入框輸入的方法和規則

(1)輸入框長度設定

# 限制輸入的長度
self.bookNameEdit.setMaxLength(10)
self.bookIdEdit.setMaxLength(6)
self.authNameEdit.setMaxLength(10)
self.publisherEdit.setMaxLength(10)
self.addNumEdit.setMaxLength(12)
self.addNumEdit.setValidator(QIntValidator())

(2)輸入框間距設定

# 標題間距
self.titleLabel.setMargin(8)
# 輸入框垂直佈局上下行之間的間距
self.layout.setVerticalSpacing(10)

(三)連線資料庫

1、傳送訊號

  • 點選新增按鈕進行訊號觸發。

  • 訊號觸發後呼叫函式。

self.addBookButton.clicked.connect(self.addBookButtonCicked)

2、獲取訊號

  • 在連線資料庫函式內,接受訊號,進行訊號處理。

(1)獲取輸入框內容

bookName = self.bookNameEdit.text()
bookId = self.bookIdEdit.text()
authName = self.authNameEdit.text()
bookCategory = self.categoryEdit.currentText()
publisher = self.publisherEdit.text()
publisherTime = self.publisherTime.text()
addBookNum = self.addNumEdit.text()

(2)邏輯判斷

  • 若獲取輸入框文字內容時,發現輸入框為空時,進行提醒。

  • 若不為空則執行else語句

if (bookName == "" or bookId == "" or authName=="" or bookCategory==""
        or publisher=="" or publisherTime=="" or addBookNum==""):
    print(QMessageBox.warning(self, "警告", "輸入框不可為空!",QMessageBox.Yes, QMessageBox.Yes))
  • else語句:連線資料庫

# 將新增的書籍數量轉為整數型別
addBookNum = int(addBookNum)
db = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName('./db/LibraryManagement.db')
db.open()
query = QSqlQuery()
  • 查詢書號bookId

sql = "select * from Book where BookID='%s'" % (bookId)
# 持續執行查詢語句
query.exec_(sql)
  • 若書號bookId存在則直接新增庫存量和可借閱量的值。

if (query.next()):
    # 新增到庫存量和可借閱量
    sql = "update Book set NumStorage=NumStorage+%d,NumCanBorrow +%d where BooId='%s'" %(addBookNum)
  • 若書號bookId不存在則建立新的書名和書號及相關資料

else:
    sql = "insert into Book values ('%s','%s','%s','%s','%s','%s',%d,%d,0)" % (
    bookName, bookId, authName, bookCategory, publisher, publisherTime, addBookNum, addBookNum)
query.exec_(sql)
db.commit()
  • 同時,開啟圖書新增資訊表

  • 將新增的圖書書號、新增時的時間、新增書籍的數量進行更新插入

timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
sql = "insert into buyordrop values ('%s', '%s', 1, '%d')" % (bookId, timenow, addBookNum)
query.exec_(sql)
db.commit()
  • 最後,提交新增書籍後的訊號,關閉並清空輸入框。

    self.add_book_success_sign.emit()
    self.close()
    self.clearEdit()
    
def clearEdit(self):
    self.bookNameEdit.clear()
    self.bookIdEdit.clear()
    self.authNameEdit.clear()
    self.addNumEdit.clear()
    self.publisherEdit.clear()

(四)程式執行入口

if __name__ == '__main__':
    app = QApplication(sys.argv)
    am = addBookDialog()
    am.show()
    sys.exit(app.exec_())

三、完整程式碼

(一)管理員介面完整程式碼

import sys
from PyQt5.QtWidgets import *
import qdarkstyle
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSql import *
from addBookDialog import addBookDialog
class AdminHome(QWidget):
    def __init__(self):
        super(AdminHome, self).__init__()
        self.setUpUi()

    def setUpUi(self):
        self.resize(900,600)
        self.setWindowTitle("歡迎進入管理員主頁")
        self.layout = QHBoxLayout()
        self.buttonlayout = QVBoxLayout()
        self.setLayout(self.layout)

        font = QFont()
        font.setPixelSize(16)

        self.userManageButton = QPushButton("使用者管理")
        self.addBookButton = QPushButton("新增書籍")
        self.dropBookButton = QPushButton("淘汰書籍")

        self.userManageButton.setFont(font)
        self.addBookButton.setFont(font)
        self.dropBookButton.setFont(font)

        self.userManageButton.setFixedWidth(100)
        self.userManageButton.setFixedHeight(42)
        self.addBookButton.setFixedWidth(100)
        self.addBookButton.setFixedHeight(42)
        self.dropBookButton.setFixedWidth(100)
        self.dropBookButton.setFixedHeight(42)
        # 將三個按鈕新增到垂直佈局中
        self.buttonlayout.addWidget(self.addBookButton)
        self.buttonlayout.addWidget(self.userManageButton)
        self.buttonlayout.addWidget(self.dropBookButton)
        # 將按鈕佈局新增到垂直佈局中
        self.layout.addLayout(self.buttonlayout)

        self.addBookButton.clicked.connect(self.addBookButtonClicked)
    def addBookButtonClicked(self):
        addDialog = addBookDialog()
        addDialog.show()
        addDialog.exec_()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    mianMindow = AdminHome()
    mianMindow.show()
    sys.exit(app.exec_())

(二)新增書籍的完整程式碼

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import time
"""
QDialog
對話方塊
"""

class addBookDialog(QDialog):
    add_book_success_sign = pyqtSignal()
    def __init__(self):
        super(addBookDialog,self).__init__()
        self.setWindowModality(Qt.WindowModal)
        self.setWindowTitle("新增書籍")
        self.setUpUI()
    def setUpUI(self):
        BookCategory = ["哲學","教育","生物學","社會科學","政治",
                        "法律","軍事","經濟","文化","體育","語言文字","地理","天文學","醫療衛生","農業"]
        self.resize(300,400)
        self.layout = QFormLayout()
        self.setLayout(self.layout)

        # 新增書籍的標籤
        self.titleLabel = QLabel("新增書籍")
        self.bookNameLabel = QLabel("書 名:")
        self.bookIdLabel = QLabel("書 號:")
        self.authNameLabel = QLabel("作 者:")
        self.categoryLabel = QLabel("分 類:")
        self.publisherLabel = QLabel("出 版 社:")
        self.publisherDateLabel = QLabel("出版日期:")
        self.addNameLabel = QLabel("數 量:")

        # button 控制元件
        self.addBookButton = QPushButton("新增")

        # lineEdit控制元件
        self.bookNameEdit = QLineEdit()
        self.bookIdEdit = QLineEdit()
        self.authNameEdit = QLineEdit()
        # 分類建立的QComboBox,儲存整個分類的列表
        # QComboBox 以佔用最少螢幕控制元件的方式向用戶呈現選項列表的方法
        self.categoryEdit = QComboBox()
        self.categoryEdit.addItems(BookCategory)
        self.publisherEdit = QLineEdit()

        # QDateTime 時間控制元件
        # setDisplayFormat 設定顯示的格式 yyyy-MM-dd 年-月-日
        self.publisherTime = QDateTimeEdit()
        self.publisherTime.setDisplayFormat("yyyy-MM-dd")
        self.addNumEdit = QLineEdit()

        # 限制輸入的長度
        self.bookNameEdit.setMaxLength(10)
        self.bookIdEdit.setMaxLength(6)
        self.authNameEdit.setMaxLength(10)
        self.publisherEdit.setMaxLength(10)
        self.addNumEdit.setMaxLength(12)
        self.addNumEdit.setValidator(QIntValidator())

        # 新增進Formlayout
        self.layout.addRow("",self.titleLabel)
        self.layout.addRow(self.bookNameLabel,self.bookNameEdit)
        self.layout.addRow(self.bookIdLabel,self.bookIdEdit)
        self.layout.addRow(self.authNameLabel,self.authNameEdit)
        self.layout.addRow(self.categoryLabel,self.categoryEdit)
        self.layout.addRow(self.publisherLabel,self.publisherEdit)
        self.layout.addRow(self.publisherDateLabel,self.publisherTime)
        self.layout.addRow(self.addNameLabel,self.addNumEdit)
        self.layout.addRow(self.addBookButton)

        # 標籤字型大小設定
        font = QFont()
        font.setPixelSize(20)
        self.titleLabel.setFont(font)
        font.setPixelSize(14)
        self.bookNameLabel.setFont(font)
        self.bookIdLabel.setFont(font)
        self.authNameLabel.setFont(font)
        self.categoryLabel.setFont(font)
        self.publisherLabel.setFont(font)
        self.publisherDateLabel.setFont(font)
        self.addNameLabel.setFont(font)

        # 設定button
        font.setPixelSize(16)
        self.addBookButton.setFont(font)
        self.addBookButton.setFixedHeight(32)
        self.addBookButton.setFixedWidth(140)

        # 設定間距
        self.titleLabel.setMargin(8)
        # 垂直佈局上下行之間的間距
        self.layout.setVerticalSpacing(10)
        self.addBookButton.clicked.connect(self.addBookButtonCicked)
    def addBookButtonCicked(self):
        bookName = self.bookNameEdit.text()
        bookId = self.bookIdEdit.text()
        authName = self.authNameEdit.text()
        bookCategory = self.categoryEdit.currentText()
        publisher = self.publisherEdit.text()
        publisherTime = self.publisherTime.text()
        addBookNum = self.addNumEdit.text()

        if (bookName == "" or bookId == "" or authName=="" or bookCategory==""
                or publisher=="" or publisherTime=="" or addBookNum==""):
            print(QMessageBox.warning(self, "警告", "輸入框不可為空!",QMessageBox.Yes, QMessageBox.Yes))
        else:
            addBookNum = int(addBookNum)
            db = QSqlDatabase.addDatabase("QSQLITE")
            db.setDatabaseName('./db/LibraryManagement.db')
            db.open()
            query = QSqlQuery()
            # 如果已存在,則更新Book的現存量,剩餘可借量,不存在,則新增到book表,
            # 同時更新採購表 採購1 淘汰0
            sql = "select * from Book where BookID='%s'" % (bookId)
            query.exec_(sql)
            if (query.next()):
                # 新增到庫存量和可借閱量
                sql = "update Book set NumStorage=NumStorage+%d,NumCanBorrow +%d where BooId='%s'" %(addBookNum)
            else:
                sql = "insert into Book values ('%s','%s','%s','%s','%s','%s',%d,%d,0)" % (
                bookName, bookId, authName, bookCategory, publisher, publisherTime, addBookNum, addBookNum)
            query.exec_(sql)
            db.commit()
            timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
            sql = "insert into buyordrop values ('%s', '%s', 1, '%d')" % (bookId, timenow, addBookNum)
            query.exec_(sql)
            db.commit()
            print(QMessageBox.information(self, "提示", "新增書籍成功!",QMessageBox.Yes,QMessageBox.Yes))
            self.add_book_success_sign.emit()
            self.close()
            self.clearEdit()

        return
    # 清空
    def clearEdit(self):
        self.bookNameEdit.clear()
        self.bookIdEdit.clear()
        self.authNameEdit.clear()
        self.addNumEdit.clear()
        self.publisherEdit.clear()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    am = addBookDialog()
    am.show()
    sys.exit(app.exec_())

四、效果展示

(一)管理員頁面效果展示

  初始佈局有點醜,待後續進行介面優化......

(二)新增書籍頁面展示

1、點選新增書籍

2、新增書籍資訊

3、提交資訊

4、資料庫書籍資訊

5、書籍書號、新增時間及數量的修改。

待後續更新....