https://v.douyin.com/i8d6yMFV 这个程序是使用PyQt5构建的简单图书管理系统,用于图形用户界面 (GUI),并使用SQLite作为数据库。该系统允许用户执行与图书管理相关的各种操作,包括添加书籍、查询书籍信息、删除书籍、注册借阅者、借书、还书、修改书籍信息以及在表格中显示书籍信息。
图书管理系统
以下是程序主要组件和功能的详细说明:
-
数据库初始化:
- 该程序使用SQLite创建两个表:
books
和borrowers
,用于存储有关图书和借阅者的信息。
- 该程序使用SQLite创建两个表:
-
用户界面(UI):
- 使用PyQt5创建了应用程序的主窗口(
BookManagementSystem
)。 - UI包括输入字段、按钮和表格小部件,以与用户进行交互。
- 使用PyQt5创建了应用程序的主窗口(
-
UI交互的方法:
- 实现了诸如
add_book
、query_book
、delete_book
、register_borrower
、borrow_book
、return_book
、modify_book
、update_book_table
和show_message
等方法,以处理用户的操作并相应地更新UI。
- 实现了诸如
-
与数据库的交互:
- 该程序与SQLite数据库交互,从数据库加载和保存数据。
- 使用
load_data_from_db
从数据库加载数据到程序的数据结构(书籍和借阅者列表)中。 - 使用
save_data_to_db
将程序的数据保存回数据库。
-
事件处理:
- 重写
closeEvent
方法以确保在关闭应用程序之前将数据保存到数据库。
- 重写
-
执行:
- 通过
if __name__ == '__main__':
作为独立应用程序执行。
- 通过
-
用法:
- 用户可以运行程序并与GUI进行交互,执行各种图书管理任务,如添加、查询、删除书籍等。
-
依赖关系:
- 该程序依赖于PyQt5用于GUI组件和SQLite用于数据库。
-
退出处理:
sys.exit(app.exec_())
确保用户关闭应用程序时能够进行干净的退出。
注意:该程序设计用于教育目的,可能不涵盖所有边缘情况,也可能不符合生产级应用程序的最佳实践。这是一个基本示例,用于说明如何使用PyQt5进行GUI编程以及与SQLite进行数据库交互。
注意:以下代码是图书信息管理系统代码非以上程序代码
import sys
import json
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QHBoxLayout, QMessageBox, QTableWidget, QTableWidgetItem, QFormLayout, QComboBox, QDialog, QDialogButtonBox
class BookDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("图书信息输入")
self.form_layout = QVBoxLayout(self)
self.login_label = QLabel("登录号:")
self.login_input = QLineEdit(self)
self.title_label = QLabel("书名:")
self.title_input = QLineEdit(self)
self.author_label = QLabel("作者名:")
self.author_input = QLineEdit(self)
self.category_label = QLabel("分类号:")
self.category_input = QLineEdit(self)
self.publisher_label = QLabel("出版单位:")
self.publisher_input = QLineEdit(self)
self.publish_date_label = QLabel("出版时间:")
self.publish_date_input = QLineEdit(self)
self.price_label = QLabel("价格:")
self.price_input = QLineEdit(self)
self.form_layout.addWidget(self.login_label)
self.form_layout.addWidget(self.login_input)
self.form_layout.addWidget(self.title_label)
self.form_layout.addWidget(self.title_input)
self.form_layout.addWidget(self.author_label)
self.form_layout.addWidget(self.author_input)
self.form_layout.addWidget(self.category_label)
self.form_layout.addWidget(self.category_input)
self.form_layout.addWidget(self.publisher_label)
self.form_layout.addWidget(self.publisher_input)
self.form_layout.addWidget(self.publish_date_label)
self.form_layout.addWidget(self.publish_date_input)
self.form_layout.addWidget(self.price_label)
self.form_layout.addWidget(self.price_input)
self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
self.form_layout.addWidget(self.button_box)
self.button_box.accepted.connect(self.accept)
self.button_box.rejected.connect(self.reject)
class BookManagementSystem(QWidget):
def __init__(self):
try:
super().__init__()
self.books = [] # 存储图书信息的列表
self.load_books_from_file() # 从文件加载图书信息
self.init_ui()
except Exception as e:
print(f"Error during initialization: {e}")
raise
def init_ui(self):
try:
# 创建界面元素
self.title_label = QLabel("图书信息管理系统")
self.book_table = QTableWidget()
self.book_table.setColumnCount(7)
self.book_table.setHorizontalHeaderLabels(["登录号", "书名", "作者名", "分类号", "出版单位", "出版时间", "价格"])
self.search_combobox = QComboBox()
self.search_combobox.addItems(["按书名查询", "按作者名查询", "条件组合查询"])
self.search_input = QLineEdit()
self.search_button = QPushButton("查询")
self.add_button = QPushButton("添加图书")
self.delete_button = QPushButton("删除图书")
self.modify_button = QPushButton("修改图书")
# 布局管理
form_layout = QFormLayout()
form_layout.addRow("查询方式:", self.search_combobox)
form_layout.addRow("查询条件:", self.search_input)
button_layout = QHBoxLayout()
button_layout.addWidget(self.search_button)
button_layout.addWidget(self.add_button)
button_layout.addWidget(self.delete_button)
button_layout.addWidget(self.modify_button)
main_layout = QVBoxLayout()
main_layout.addWidget(self.title_label)
main_layout.addLayout(form_layout)
main_layout.addWidget(self.book_table)
main_layout.addLayout(button_layout)
self.setLayout(main_layout)
# 信号与槽连接
self.search_button.clicked.connect(self.search_books)
self.add_button.clicked.connect(self.add_book)
self.delete_button.clicked.connect(self.delete_book)
self.modify_button.clicked.connect(self.modify_book)
# 设置窗口属性
self.setGeometry(100, 100, 800, 600)
self.setWindowTitle('图书信息管理系统')
# 显示加载的图书信息
self.display_books(self.books)
self.show()
except Exception as e:
print(f"Error during UI initialization: {e}")
raise
def load_books_from_file(self):
try:
with open('books_data.json', 'r', encoding='utf-8') as file:
self.books = json.load(file)
print("Successfully loaded books from file.")
except FileNotFoundError:
print("File not found. Starting with an empty book list.")
except Exception as e:
print(f"Error loading books from file: {e}")
def save_books_to_file(self):
try:
with open('books_data.json', 'w', encoding='utf-8') as file:
json.dump(self.books, file, ensure_ascii=False, indent=4)
print("Successfully saved books to file.")
except Exception as e:
print(f"Error saving books to file: {e}")
def search_books(self):
try:
search_type = self.search_combobox.currentText()
search_value = self.search_input.text()
if search_type == "按书名查询":
result = [book for book in self.books if search_value.lower() in book["书名"].lower()]
elif search_type == "按作者名查询":
result = [book for book in self.books if search_value.lower() in book["作者名"].lower()]
elif search_type == "条件组合查询":
result = [book for book in self.books if
search_value.lower() in book["书名"].lower() or search_value.lower() in book["作者名"].lower()]
self.display_books(result)
except Exception as e:
print(f"Error during search_books: {e}")
def display_books(self, book_list):
try:
self.book_table.setRowCount(0)
for row, book in enumerate(book_list):
self.book_table.insertRow(row)
for col, (key, value) in enumerate(book.items()):
item = QTableWidgetItem(str(value))
self.book_table.setItem(row, col, item)
except Exception as e:
print(f"Error during display_books: {e}")
def add_book(self):
try:
dialog = BookDialog(self)
result = dialog.exec_()
if result == QDialog.Accepted:
login = dialog.login_input.text()
title = dialog.title_input.text()
author = dialog.author_input.text()
category = dialog.category_input.text()
publisher = dialog.publisher_input.text()
publish_date = dialog.publish_date_input.text()
price = dialog.price_input.text()
new_book = {
"登录号": login,
"书名": title,
"作者名": author,
"分类号": category,
"出版单位": publisher,
"出版时间": publish_date,
"价格": price
}
self.books.append(new_book)
self.display_books(self.books)
self.save_books_to_file() # 保存图书信息到文件
except Exception as e:
print(f"Error during add_book: {e}")
def delete_book(self):
try:
current_row = self.book_table.currentRow()
if current_row >= 0:
result = QMessageBox.question(self, '删除确认', '确认删除所选图书吗?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if result == QMessageBox.Yes:
del self.books[current_row]
self.display_books(self.books)
self.save_books_to_file() # 保存图书信息到文件
except Exception as e:
print(f"Error during delete_book: {e}")
def modify_book(self):
try:
current_row = self.book_table.currentRow()
if current_row >= 0:
current_book = self.books[current_row]
dialog = BookDialog(self)
# 设置对话框中的输入框初始值
dialog.login_input.setText(current_book["登录号"])
dialog.title_input.setText(current_book["书名"])
dialog.author_input.setText(current_book["作者名"])
dialog.category_input.setText(current_book["分类号"])
dialog.publisher_input.setText(current_book["出版单位"])
# 在设置之前将值转换为字符串
dialog.publish_date_input.setText(str(current_book["出版时间"]))
dialog.price_input.setText(str(current_book["价格"]))
result = dialog.exec_()
if result == QDialog.Accepted:
# 更新图书信息
self.books[current_row] = {
"登录号": dialog.login_input.text(),
"书名": dialog.title_input.text(),
"作者名": dialog.author_input.text(),
"分类号": dialog.category_input.text(),
"出版单位": dialog.publisher_input.text(),
"出版时间": dialog.publish_date_input.text(),
"价格": dialog.price_input.text()
}
self.display_books(self.books)
self.save_books_to_file() # 保存图书信息到文件
except Exception as e:
print(f"Error during modify_book: {e}")
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = BookManagementSystem()
sys.exit(app.exec_())