pythonQT版本的图书管理系统

界面的设计

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_())
相关推荐
一只理智恩1 小时前
AI 实战应用:从“搜索式问答“到“理解式助教“
人工智能·python·语言模型·golang
Katecat996631 小时前
输液泵设备检测与识别基于改进YOLO11模型的实现详解_ETB
python
Sirius.z1 小时前
第T7周:咖啡豆识别
python
yao12497364732 小时前
【无标题】
python·synergy·deskflow·键鼠共享·hyprland·niri
workflower2 小时前
原子需求的属性
python·测试用例·需求分析·软件需求
尘缘浮梦3 小时前
协程asyncio入门案例 2
开发语言·python
kronos.荒3 小时前
滑动窗口+哈希表:最小覆盖子串
数据结构·python·散列表
AC赳赳老秦3 小时前
文旅AI趋势:DeepSeek赋能客流数据,驱动2026智慧文旅规模化跃迁
人工智能·python·mysql·安全·架构·prometheus·deepseek
一个处女座的程序猿O(∩_∩)O3 小时前
Python面向对象的多态特性详解
开发语言·python