PyQT5一起学做图书管理系统(6)添加/删除书籍
PyQT5一起学做图书管理系统(6)添加/删除书籍
环境
系统:windows10系统
编辑器:Sublime3
编程语言:python3+pyqt5
前言
本节来实现书籍的添加与删除,还是那句话,记得首先把数据库模块那一节给完成了,这样的话,本节就很容易实现
设计逻辑
添加/删除功能都是一个对话框(Dialog),在这个界面填入必要的信息之后,执行数据库就OK了
添加功能
对于添加逻辑,需要添加以下信息
- 书名
- 书号
- 作者名
- 分类(分类已经规定,只需要选择对应的种类就可以了)
- 出版社
- 出版日期
- 添加的数量
初始化
首先初始化数据库,然后初始化UI界面
class addBookDialog(QDialog):
add_book_success_signal = pyqtSignal()
def __init__(self, parent=None):
super(addBookDialog, self).__init__(parent)
self.setUpUI()
self.setWindowModality(Qt.WindowModal)
self.bookdb=BookDbManager()
self.addordropdb=AddOrDropManager()
self.setWindowTitle("添加书籍")
初始化UI界面
书籍类别中规定好图书的分类,然后添加各个信息的lable和lineEdit,接着设计好字体大小颜色,把各个控件有序的放好,最后为添加按钮绑定监听事件。
def setUpUI(self):
# 书名,书号,作者,分类,添加数量.出版社,出版日期
# 书籍分类:哲学类、社会科学类、政治类、法律类、军事类、经济类、文化类、教育类、体育类、语言文字类、艺术类、历史类、地理类、天文学类、生物学类、医学卫生类、农业类
BookCategory = ["哲学", "社会科学", "政治", "法律", "军事", "经济", "文化", "教育", "体育", "语言文字", "艺术", "历史"
, "地理", "天文学", "生物学", "医学卫生", "农业"]
self.resize(300, 400)
self.layout = QFormLayout()
self.setLayout(self.layout)
# Label控件
self.titlelabel = QLabel(" 添加书籍")
self.bookNameLabel = QLabel("书 名:")
self.bookIdLabel = QLabel("书 号:")
self.authNameLabel = QLabel("作 者:")
self.categoryLabel = QLabel("分 类:")
self.publisherLabel = QLabel("出 版 社:")
self.publishDateLabel = QLabel("出版日期:")
self.addNumLabel = QLabel("添加数量:")
# button控件
self.addBookButton = QPushButton("添 加")
# lineEdit控件
self.bookNameEdit = QLineEdit()
self.bookIdEdit = QLineEdit()
self.authNameEdit = QLineEdit()
self.categoryComboBox = QComboBox()
self.categoryComboBox.addItems(BookCategory)
self.publisherEdit = QLineEdit()
self.publishTime = QDateTimeEdit()
self.publishTime.setDisplayFormat("yyyy-MM-dd")
# self.publishDateEdit = QLineEdit()
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.categoryComboBox)
self.layout.addRow(self.publisherLabel, self.publisherEdit)
self.layout.addRow(self.publishDateLabel, self.publishTime)
self.layout.addRow(self.addNumLabel, 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.publishDateLabel.setFont(font)
self.addNumLabel.setFont(font)
self.bookNameEdit.setFont(font)
self.bookIdEdit.setFont(font)
self.authNameEdit.setFont(font)
self.publisherEdit.setFont(font)
self.publishTime.setFont(font)
self.categoryComboBox.setFont(font)
self.addNumEdit.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.categoryComboBox.currentText()
publisher = self.publisherEdit.text()
publishTime = self.publishTime.text()
addBookNum = self.addNumEdit.text()
if (
bookName == "" or bookId == "" or authName == "" or bookCategory == "" or publisher == "" or publishTime == "" or addBookNum == ""):
print(QMessageBox.warning(self, "警告", "有字段为空,添加失败", QMessageBox.Yes, QMessageBox.Yes))
return
else:
addBookNum = int(addBookNum)
bookinfo=self.bookdb.querybyBookID(bookId)
if (bookinfo):
self.bookdb.updateBookinfo(addBookNum,bookId,addFlag=1)
else:
self.bookdb.addBOOK(bookName, bookId, authName, bookCategory, publisher, publishTime, addBookNum, addBookNum,0)
# 插入droporinsert表
timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
self.addordropdb.addinfo(bookId, timenow, addBookNum)
print(QMessageBox.information(self, "提示", "添加书籍成功!", QMessageBox.Yes, QMessageBox.Yes))
self.add_book_success_signal.emit()
self.close()
self.clearEdit()
return
def clearEdit(self):
self.bookNameEdit.clear()
self.bookIdEdit.clear()
self.authNameEdit.clear()
self.addNumEdit.clear()
self.publisherEdit.clear()
删除功能
删除书籍的界面和添加界面类似,但是在界面上稍微有一点区别,删除书籍时,需要根据BookID来删除,因此z在界面上,除了BookID之外,其他的输入框都是readonly属性。
删除逻辑是,如果当前书籍全部在书库中,没有被外借,则之前全部删除,如果还有外借的书籍,则提示删除上限(即只能删除库中现存书籍数量)
效果图
全部代码
addBookDialog.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-12-05 21:32:31
# @Author : Jimy_Fengqi (jmps515@163.com)
# @Link : https://blog.csdn.net/qiqiyingse/
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import qdarkstyle
import time
#from PyQt5.QtSql import *
from db.userInfoManager import BookDbManager
from db.userInfoManager import AddOrDropManager
import images
class addBookDialog(QDialog):
add_book_success_signal = pyqtSignal()
def __init__(self, parent=None):
super(addBookDialog, self).__init__(parent)
self.setUpUI()
self.setWindowModality(Qt.WindowModal)
self.bookdb=BookDbManager()
self.addordropdb=AddOrDropManager()
self.setWindowTitle("添加书籍")
def setUpUI(self):
# 书名,书号,作者,分类,添加数量.出版社,出版日期
# 书籍分类:哲学类、社会科学类、政治类、法律类、军事类、经济类、文化类、教育类、体育类、语言文字类、艺术类、历史类、地理类、天文学类、生物学类、医学卫生类、农业类
BookCategory = ["哲学", "社会科学", "政治", "法律", "军事", "经济", "文化", "教育", "体育", "语言文字", "艺术", "历史"
, "地理", "天文学", "生物学", "医学卫生", "农业"]
self.resize(300, 400)
self.layout = QFormLayout()
self.setLayout(self.layout)
# Label控件
self.titlelabel = QLabel(" 添加书籍")
self.bookNameLabel = QLabel("书 名:")
self.bookIdLabel = QLabel("书 号:")
self.authNameLabel = QLabel("作 者:")
self.categoryLabel = QLabel("分 类:")
self.publisherLabel = QLabel("出 版 社:")
self.publishDateLabel = QLabel("出版日期:")
self.addNumLabel = QLabel("添加数量:")
# button控件
self.addBookButton = QPushButton("添 加")
# lineEdit控件
self.bookNameEdit = QLineEdit()
self.bookIdEdit = QLineEdit()
self.authNameEdit = QLineEdit()
self.categoryComboBox = QComboBox()
self.categoryComboBox.addItems(BookCategory)
self.publisherEdit = QLineEdit()
self.publishTime = QDateTimeEdit()
self.publishTime.setDisplayFormat("yyyy-MM-dd")
# self.publishDateEdit = QLineEdit()
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.categoryComboBox)
self.layout.addRow(self.publisherLabel, self.publisherEdit)
self.layout.addRow(self.publishDateLabel, self.publishTime)
self.layout.addRow(self.addNumLabel, 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.publishDateLabel.setFont(font)
self.addNumLabel.setFont(font)
self.bookNameEdit.setFont(font)
self.bookIdEdit.setFont(font)
self.authNameEdit.setFont(font)
self.publisherEdit.setFont(font)
self.publishTime.setFont(font)
self.categoryComboBox.setFont(font)
self.addNumEdit.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.categoryComboBox.currentText()
publisher = self.publisherEdit.text()
publishTime = self.publishTime.text()
addBookNum = self.addNumEdit.text()
if (
bookName == "" or bookId == "" or authName == "" or bookCategory == "" or publisher == "" or publishTime == "" or addBookNum == ""):
print(QMessageBox.warning(self, "警告", "有字段为空,添加失败", QMessageBox.Yes, QMessageBox.Yes))
return
else:
addBookNum = int(addBookNum)
bookinfo=self.bookdb.querybyBookID(bookId)
if (bookinfo):
self.bookdb.updateBookinfo(addBookNum,bookId,addFlag=1)
else:
self.bookdb.addBOOK(bookName, bookId, authName, bookCategory, publisher, publishTime, addBookNum, addBookNum,0)
# 插入droporinsert表
timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
self.addordropdb.addinfo(bookId, timenow, addBookNum)
print(QMessageBox.information(self, "提示", "添加书籍成功!", QMessageBox.Yes, QMessageBox.Yes))
self.add_book_success_signal.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)
app.setWindowIcon(QIcon(":/images/MainWindow_1.png"))
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
mainMindow = addBookDialog()
mainMindow.show()
sys.exit(app.exec_())
dropBookDialog.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-12-05 21:28:34
# @Author : Jimy_Fengqi (jmps515@163.com)
# @Link : https://blog.csdn.net/qiqiyingse/
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import qdarkstyle
#from PyQt5.QtSql import *
from db.userInfoManager import BookDbManager
from db.userInfoManager import AddOrDropManager
import time
import images
class dropBookDialog(QDialog):
drop_book_successful_signal=pyqtSignal()
def __init__(self, parent=None):
super(dropBookDialog, self).__init__(parent)
self.setUpUI()
self.setWindowModality(Qt.WindowModal)
self.setWindowTitle("删除书籍")
self.bookdb=BookDbManager()
self.addordropdb=AddOrDropManager()
def setUpUI(self):
# 书名,书号,作者,分类,添加数量.出版社,出版日期
# 书籍分类:哲学类、社会科学类、政治类、法律类、军事类、经济类、文化类、教育类、体育类、语言文字类、艺术类、历史类、地理类、天文学类、生物学类、医学卫生类、农业类
BookCategory = ["哲学", "社会科学", "政治", "法律", "军事", "经济", "文化", "教育", "体育", "语言文字", "艺术", "历史"
, "地理", "天文学", "生物学", "医学卫生", "农业"]
self.resize(300, 400)
self.layout = QFormLayout()
self.setLayout(self.layout)
# Label控件
self.titlelabel = QLabel(" 淘汰书籍")
self.bookNameLabel = QLabel("书 名:")
self.bookIdLabel = QLabel("书 号:")
self.authNameLabel = QLabel("作 者:")
self.categoryLabel = QLabel("分 类:")
self.publisherLabel = QLabel("出 版 社:")
self.publishDateLabel = QLabel("出版日期:")
self.dropNumLabel = QLabel("数 量:")
# button控件
self.dropBookButton = QPushButton("淘 汰")
# lineEdit控件
self.bookNameEdit = QLineEdit()
self.bookIdEdit = QLineEdit()
self.authNameEdit = QLineEdit()
self.categoryComboBox = QComboBox()
self.categoryComboBox.addItems(BookCategory)
self.publisherEdit = QLineEdit()
self.publishTime = QLineEdit()
# self.publishDateEdit = QLineEdit()
self.dropNumEdit = QLineEdit()
self.bookNameEdit.setMaxLength(10)
self.bookIdEdit.setMaxLength(6)
self.authNameEdit.setMaxLength(10)
self.publisherEdit.setMaxLength(10)
self.dropNumEdit.setMaxLength(12)
self.dropNumEdit.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.categoryComboBox)
self.layout.addRow(self.publisherLabel, self.publisherEdit)
self.layout.addRow(self.publishDateLabel, self.publishTime)
self.layout.addRow(self.dropNumLabel, self.dropNumEdit)
self.layout.addRow("", self.dropBookButton)
# 设置字体
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.publishDateLabel.setFont(font)
self.dropNumLabel.setFont(font)
self.bookNameEdit.setFont(font)
self.bookNameEdit.setReadOnly(True)
self.bookNameEdit.setStyleSheet("background-color:#363636")
self.bookIdEdit.setFont(font)
self.authNameEdit.setFont(font)
self.authNameEdit.setReadOnly(True)
self.authNameEdit.setStyleSheet("background-color:#363636")
self.publisherEdit.setFont(font)
self.publisherEdit.setReadOnly(True)
self.publisherEdit.setStyleSheet("background-color:#363636")
self.publishTime.setFont(font)
self.publishTime.setStyleSheet("background-color:#363636")
self.categoryComboBox.setFont(font)
self.categoryComboBox.setStyleSheet("background-color:#363636")
self.dropNumEdit.setFont(font)
# button设置
font.setPixelSize(16)
self.dropBookButton.setFont(font)
self.dropBookButton.setFixedHeight(32)
self.dropBookButton.setFixedWidth(140)
# 设置间距
self.titlelabel.setMargin(8)
self.layout.setVerticalSpacing(10)
self.dropBookButton.clicked.connect(self.dropBookButtonClicked)
self.bookIdEdit.textChanged.connect(self.bookIdEditChanged)
def bookIdEditChanged(self):
bookId = self.bookIdEdit.text()
if (bookId == ""):
self.bookNameEdit.clear()
self.publisherEdit.clear()
self.authNameEdit.clear()
self.dropNumEdit.clear()
self.publishTime.clear()
bookinfo=self.bookdb.querybyBookID(bookId)
# 查询对应书号,如果存在就更新form
if (bookinfo):
self.bookNameEdit.setText(bookinfo[0][0])
self.authNameEdit.setText(bookinfo[0][2])
self.categoryComboBox.setCurrentText(bookinfo[0][3])
self.publisherEdit.setText(bookinfo[0][4])
self.publishTime.setText(bookinfo[0][5])
return
def dropBookButtonClicked(self):
bookId = self.bookIdEdit.text()
dropNum = 0
if (self.dropNumEdit.text() == ""):
print(QMessageBox.warning(self, "警告", "淘汰数目为空,请检查输入,操作失败"), QMessageBox.Yes, QMessageBox.Yes)
return
dropNum = int(self.dropNumEdit.text())
bookinfo=self.bookdb.querybyBookID(bookId)
if (bookinfo):
if (dropNum > bookinfo[0][7] and dropNum < bookinfo[0][6]):
print(QMessageBox.warning(self, "警告", "还有%d本未入库,最多可淘汰%d本,请检查输入" % (bookinfo[0][8],bookinfo[0][7]),
QMessageBox.Yes,QMessageBox.Yes))
return
elif dropNum > bookinfo[0][6]:
QMessageBox.warning(self, "警告", "最多可淘汰%d本,请检查输入" % bookinfo[0][6], QMessageBox.Yes,QMessageBox.Yes)
return
elif dropNum <= 0:
QMessageBox.warning(self, "警告", "输入数量错误,请检查输入" , QMessageBox.Yes,QMessageBox.Yes)
self.dropNumEdit.clear()
return
# 更新Book表和BuyorDrop表
# 如果drop书目和当前库存相同,则直接删除Book记录(这里先默认当前所有书都在库存中)
if dropNum < bookinfo[0][7] and dropNum > 0:
self.bookdb.updateBookinfo(dropNum, bookId,addFlag=0)
elif dropNum == bookinfo[0][6] and bookinfo[0][8] == 0:
self.bookdb.dropBook(bookId)
timenow = time.strftime('%Y-%m-%d', time.localtime(time.time()))
self.addordropdb.dropinfo(bookId, timenow, dropNum)
print(QMessageBox.information(self, "提示", "淘汰书籍成功!", QMessageBox.Yes, QMessageBox.Yes))
self.drop_book_successful_signal.emit()
self.close()
return
if __name__ == "__main__":
app = QApplication(sys.argv)
app.setWindowIcon(QIcon(":/images/MainWindow_1.png"))
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
mainMindow = dropBookDialog()
mainMindow.show()
sys.exit(app.exec_())