界面的设计
python
复制代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'book_management.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(900, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(10, 30, 181, 21))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(200, 30, 171, 21))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(400, 30, 171, 21))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(600, 30, 171, 21))
self.pushButton_4.setObjectName("pushButton_4")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(10, 60, 881, 531))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.tableWidget.sizePolicy().hasHeightForWidth())
self.tableWidget.setSizePolicy(sizePolicy)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(7)
self.tableWidget.setRowCount(0)
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)
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(200, 10, 164, 22))
self.widget.setObjectName("widget")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.label_2 = QtWidgets.QLabel(self.widget)
self.label_2.setObjectName("label_2")
self.horizontalLayout_2.addWidget(self.label_2)
self.lineEdit_2 = QtWidgets.QLineEdit(self.widget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.horizontalLayout_2.addWidget(self.lineEdit_2)
self.widget1 = QtWidgets.QWidget(self.centralwidget)
self.widget1.setGeometry(QtCore.QRect(20, 10, 164, 22))
self.widget1.setObjectName("widget1")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget1)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.widget1)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.lineEdit = QtWidgets.QLineEdit(self.widget1)
self.lineEdit.setObjectName("lineEdit")
self.horizontalLayout.addWidget(self.lineEdit)
self.widget2 = QtWidgets.QWidget(self.centralwidget)
self.widget2.setGeometry(QtCore.QRect(600, 10, 164, 22))
self.widget2.setObjectName("widget2")
self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.widget2)
self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_3 = QtWidgets.QLabel(self.widget2)
self.label_3.setObjectName("label_3")
self.horizontalLayout_4.addWidget(self.label_3)
self.lineEdit_4 = QtWidgets.QLineEdit(self.widget2)
self.lineEdit_4.setObjectName("lineEdit_4")
self.horizontalLayout_4.addWidget(self.lineEdit_4)
self.widget3 = QtWidgets.QWidget(self.centralwidget)
self.widget3.setGeometry(QtCore.QRect(400, 10, 168, 22))
self.widget3.setObjectName("widget3")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.widget3)
self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.label_4 = QtWidgets.QLabel(self.widget3)
self.label_4.setObjectName("label_4")
self.horizontalLayout_3.addWidget(self.label_4)
self.lineEdit_3 = QtWidgets.QLineEdit(self.widget3)
self.lineEdit_3.setObjectName("lineEdit_3")
self.horizontalLayout_3.addWidget(self.lineEdit_3)
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.pushButton.setText(_translate("MainWindow", "增加图书"))
self.pushButton_2.setText(_translate("MainWindow", "删除图书"))
self.pushButton_3.setText(_translate("MainWindow", "搜索图书"))
self.pushButton_4.setText(_translate("MainWindow", "刷新列表"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "ID"))
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", "ISBN"))
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", "操作"))
self.label_2.setText(_translate("MainWindow", "作者"))
self.label.setText(_translate("MainWindow", "书名"))
self.label_3.setText(_translate("MainWindow", "分类"))
self.label_4.setText(_translate("MainWindow", "ISBN"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
图书馆管理系统的逻辑函数的编写
复制代码
import json
import os
class BookManager:
def __init__(self, data_file="books.json"):
"""
初始化图书管理器
:param data_file: 存储图书数据的JSON文件路径
"""
self.data_file = data_file
self.books = [] # 存储图书数据的列表
self.load_books() # 加载已有数据
def load_books(self):
"""
从JSON文件加载图书数据
"""
if os.path.exists(self.data_file):
# 如果文件存在,读取数据
with open(self.data_file, 'r', encoding='utf-8') as f:
self.books = json.load(f)
else:
# 如果文件不存在,创建空列表
self.books = []
self.save_books() # 创建空文件
def save_books(self):
"""
将图书数据保存到JSON文件
"""
with open(self.data_file, 'w', encoding='utf-8') as f:
json.dump(self.books, f, ensure_ascii=False, indent=2)
def add_book(self, title, author, isbn, category):
"""
添加新图书
:param title: 书名
:param author: 作者
:param isbn: ISBN号
:param category: 分类
:return: 新添加的图书字典
"""
# 生成新ID(如果列表为空则为1,否则为最大ID+1)
new_id = max([book['id'] for book in self.books], default=0) + 1
# 创建新图书字典
new_book = {
'id': new_id,
'title': title,
'author': author,
'isbn': isbn,
'category': category
}
# 添加到书籍列表
self.books.append(new_book)
# 保存到文件
self.save_books()
return new_book
def delete_book(self, book_id):
"""
删除指定ID的图书
:param book_id: 要删除的图书ID
:return: 是否删除成功
"""
original_length = len(self.books)
# 过滤掉指定ID的图书
self.books = [book for book in self.books if book['id'] != book_id]
if len(self.books) < original_length:
# 如果列表长度减少了,说明删除成功
self.save_books()
return True
else:
# 没有找到对应ID的图书
return False
def search_books(self, title="", author="", isbn="", category=""):
results = []
for book in self.books:
if (title.lower() in book['title'].lower() and
author.lower() in book['author'].lower() and
isbn.lower() in book['isbn'].lower() and
category.lower() in book['category'].lower()):
results.append(book)
return results
def get_all_books(self):
"""
获取所有图书
:return: 所有图书列表
"""
return self.books
main方法函数逻辑
python
复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QTableWidgetItem
from book_management_ui import Ui_MainWindow
from book_manager import BookManager
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.manager = BookManager()
self.init_signal()
self.query_books() # 启动时直接查询一次
# ======================
# 绑定信号
# ======================
def init_signal(self):
self.ui.pushButton.clicked.connect(self.add_book)
self.ui.pushButton_2.clicked.connect(self.delete_book)
# 搜索和刷新都调用同一个函数
self.ui.pushButton_3.clicked.connect(self.query_books)
self.ui.pushButton_4.clicked.connect(self.query_books)
# ======================
# 查询(核心函数)
# ======================
def query_books(self):
title = self.ui.lineEdit.text().strip()
author = self.ui.lineEdit_2.text().strip()
isbn = self.ui.lineEdit_3.text().strip()
category = self.ui.lineEdit_4.text().strip()
books = self.manager.search_books(
title=title,
author=author,
isbn=isbn,
category=category
)
self.load_table(books)
# ======================
# 添加图书
# ======================
def add_book(self):
title = self.ui.lineEdit.text().strip()
author = self.ui.lineEdit_2.text().strip()
isbn = self.ui.lineEdit_3.text().strip()
category = self.ui.lineEdit_4.text().strip()
if not title:
QMessageBox.warning(self, "错误", "书名不能为空")
return
try:
self.manager.add_book(title, author, isbn, category)
QMessageBox.information(self, "成功", "添加成功")
self.query_books()
except Exception as e:
QMessageBox.warning(self, "错误", str(e))
# ======================
# 删除图书
# ======================
def delete_book(self):
row = self.ui.tableWidget.currentRow()
if row == -1:
QMessageBox.warning(self, "错误", "请选择一行")
return
book_id = int(self.ui.tableWidget.item(row, 0).text())
if self.manager.delete_book(book_id):
QMessageBox.information(self, "成功", "删除成功")
self.query_books()
else:
QMessageBox.warning(self, "错误", "删除失败")
# ======================
# 表格加载
# ======================
def load_table(self, books):
self.ui.tableWidget.setRowCount(0)
for row, book in enumerate(books):
self.ui.tableWidget.insertRow(row)
self.ui.tableWidget.setItem(row, 0, QTableWidgetItem(str(book["id"])))
self.ui.tableWidget.setItem(row, 1, QTableWidgetItem(book["title"]))
self.ui.tableWidget.setItem(row, 2, QTableWidgetItem(book["author"]))
self.ui.tableWidget.setItem(row, 3, QTableWidgetItem(book["isbn"]))
self.ui.tableWidget.setItem(row, 4, QTableWidgetItem(book["category"]))
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())