用Python来简单实现图书管理系统程序设计

本文详细描述了一个图书管理系统的需求分析,包括功能需求(如借书、还书、增删查改等)、质量需求(安全性、可靠性和可用性)以及约束条件。通过Python的Tkinter库实现了登录、退出界面和图书管理功能,包括图书的增删、借阅和查询。
摘要由CSDN通过智能技术生成

一、对问题进行需求分析

1、功能需求:

(1)借书、还书

(2)实现增删查改

(3)根据作者名称或专业领域检索书籍

(4)找出借走某本书的读者

2、质量需求:
根据上述描述,可以确定以下质量需求
(1)安全性:系统对数据进行安全存储和传输,不受任何非法访问、修改、破坏等安全威胁。
(2)可靠性:系统能够长时间连续运行,不会频繁崩溃、死机,能够及时响应用户请求,保证数据处理!的准确性和完整性。
(3)可用性:系统界面友好、操作简单、响应迅速能够满足用户日常使用的要求,提升用户体验。

3、约束需求:
根据上述描述,可以确定以下约束需求:
(1)未借出的书籍必须能够供读者随时借阅。
(2)同一时刻,一本书不能既被借出,又可供借阅

(3)一个读者一次借出的书籍数目不能超过预定值。

(叠个buff:笨人普通大学生,如有不完善的地方轻喷)

二、代码实现

    一、导入需要的库     

      首先可以肯定的是,我们需要创建一个交互界面,来实现对功能的实现,这就需要tkinter库来实现设计交互界面的功能。同时,借阅书籍需要对时间进行记录,我们导入datetime库来进行对时间的记录。

import tkinter as tk
from tkinter import simpledialog, messagebox, ttk
import datetime

    二、设立类         

      图书管理系统,并且拥有管理员和读者身份,需要一个User与Library,作为后续设立Library GUI的前置条件。

class User:
    def __init__(self, name, role):
        self.name = name
        self.role = role  # "admin" 或 "reader"

     这样我们就建立好了使用者的名称与角色,并根据角色的不同来拥有不同的权限。

class Library:
    def __init__(self):
        self.books = {}
        self.borrowed_books = {}
        self.max_borrow_limit = 3
        self.users = {"admin": User("admin", "admin"), "reader": User("reader", "reader")}
        self.current_user = None

     在这里,我们定义了最大的借书数量是3本,并且设定了两个使用者的角色,分别是admin和reader,并且令当前用户不存在,来实现后续的登录功能。

    一、登录界面的设计

def login(self, username):
        if username in self.users:
            self.current_user = self.users[username]
            return True
        return False

      设定一个login函数,当输入的用户名存在我们设置的self.users当中,将current_user替换为我们登录的用户,允许进行接下来的操作,否则报错。

    二、退出界面的设计

def logout(self):
        self.current_user = None
        return True

       直接把当前用户置空,并返回真值,回到登录界面

   三、实现增删查改的设计

       不进行过多赘述,直接上代码(笨人会写但是讲不明白QvQ)

def add_book(self, title, quantity, author="", field=""):
        if title not in self.books:
            self.books[title] = {"quantity": 0, "author": author, "field": field}
        self.books[title]["quantity"] += quantity

    def remove_book(self, title, quantity=1):
        if title in self.books and self.books[title]["quantity"] >= quantity:
            self.books[title]["quantity"] -= quantity
            if self.books[title]["quantity"] == 0:
                del self.books[title]
            return True
        return False

    def borrow_book(self, title, reader):
        if title in self.books and self.books[title]["quantity"] > 0:
            if len([b for b in self.borrowed_books if self.borrowed_books[b]["reader"] == reader]) >= self.max_borrow_limit:
                return False
            self.books[title]["quantity"] -= 1
            self.borrowed_books[title] = {"reader": reader, "date": datetime.date.today()}
            return True
        return False

    def return_book(self, title, reader):
        if title in self.borrowed_books and self.borrowed_books[title]["reader"] == reader:
            self.books[title]["quantity"] += 1
            del self.borrowed_books[title]
            return True
        return False

    def get_stock_info(self):
        if not self.books:
            return "当前图书库存为空。"
        message = "当前图书库存总量:\n"
        for title in self.books:
            message += f"《{title}》:{self.books[title]['quantity']} 本\n"
        return message.strip()

    def search_books(self, author="", field=""):
        result = {}
        for title, details in self.books.items():
            if author and details["author"].lower() == author.lower() or field and details["field"].lower() == field.lower():
                result[title] = details
        return result
    
    def get_books_by_reader(self, reader):
        return [title for title, borrow_details in self.borrowed_books.items() if borrow_details['reader'] == reader]

   四、设置LibraryGUI类

    在这里我们要设置交互界面,并设置实现我们刚刚在Library中创建的函数,用ttk.Button来创建功能按钮。

class LibraryGUI:
    def __init__(self, root, library):
        self.library = library
        self.root = root
        self.root.title("图书管理系统")
        self.root.geometry("800x600")

        self.login_screen()

    def login_screen(self):
        self.clear_ui()
        username = simpledialog.askstring("登录", "请输入您的用户名:")
        if username and self.library.login(username):
            self.init_ui()
        else:
            messagebox.showerror("登录失败", "用户名不正确。")
            # 登录失败后,再次显示登录界面
            self.login_screen()

    def init_ui(self):
        # 根据当前用户角色初始化UI
        if self.library.current_user.role == "admin":
            # 为管理员显示的按钮
            ttk.Button(self.root, text="添加图书", command=self.add_book).pack(fill=tk.X, pady=5)
            ttk.Button(self.root, text="删除图书", command=self.remove_book_gui).pack(fill=tk.X, pady=5)
            ttk.Button(self.root, text="借书", command=self.borrow_book).pack(fill=tk.X, pady=5)
            ttk.Button(self.root, text="还书", command=self.return_book).pack(fill=tk.X, pady=5)
            ttk.Button(self.root, text="库存统计", command=self.count_books).pack(fill=tk.X, pady=5)
            ttk.Button(self.root, text="显示所有借书记录", command=self.show_all_borrows).pack(fill=tk.X, pady=5)
            ttk.Button(self.root, text="退出", command=self.logout).pack(fill=tk.X, pady=5)
        # 为所有用户显示的按钮
        if self.library.current_user.role == "reader":
           ttk.Button(self.root,text="我的借书记录",command=self.show_my_borrows).pack(fill=tk.X, pady=5)
           ttk.Button(self.root, text="搜索图书", command=self.search_books).pack(fill=tk.X, pady=5)
           ttk.Button(self.root, text="退出", command=self.logout).pack(fill=tk.X, pady=5)
    
    def add_book(self):
        title = simpledialog.askstring("添加图书", "书名:")
        if title:
            author = simpledialog.askstring("添加图书", "作者:")
            field = simpledialog.askstring("添加图书", "领域:")
            quantity = simpledialog.askinteger("添加图书", "数量:", minvalue=1)
            self.library.add_book(title, quantity, author, field)
            messagebox.showinfo("成功", "成功添加图书。")

    def remove_book_gui(self):
        title = simpledialog.askstring("删除图书", "书名:")
        if  title:
            quantity = simpledialog.askinteger("删除图书", "数量:", minvalue=1)
        if self.library.remove_book(title, quantity):
            messagebox.showinfo("成功", "图书删除成功。")
        else:
            messagebox.showerror("失败", "图书删除失败,请检查书名和数量是否正确。")

    def borrow_book(self):
        title = simpledialog.askstring("借书", "书名:")
        if title:
            reader = simpledialog.askstring("借书", "读者姓名:")
            if reader and self.library.borrow_book(title, reader):
                messagebox.showinfo("成功", "借书成功。")
            else:
                messagebox.showerror("失败", "借书失败。")

    def return_book(self):
        title = simpledialog.askstring("还书", "书名:")
        if title:
            reader = simpledialog.askstring("还书", "读者姓名:")
            if reader and self.library.return_book(title, reader):
                messagebox.showinfo("成功", "还书成功。")
            else:
                messagebox.showerror("失败", "还书失败。")

    def count_books(self):
        info = self.library.get_stock_info()
        messagebox.showinfo("库存统计", info)

    def show_all_borrows(self):
        message = "当前借书记录:\n"
        for title, details in self.library.borrowed_books.items():
            message += f"书名:{title}, 借阅者:{details['reader']}, 借阅日期:{details['date']}\n"
        messagebox.showinfo("借书记录", message or "当前没有借书记录。")

    def show_my_borrows(self):
        message = "当前借书记录:\n"
        for title, details in self.library.borrowed_books.items():
            message += f"书名:{title}, 借阅者:{details['reader']}, 借阅日期:{details['date']}\n"
        messagebox.showinfo("借书记录", message or "当前没有借书记录。")
    
    def search_books(self):
        title = simpledialog.askstring("搜索图书","书名(可留空):")
        author = simpledialog.askstring("搜索图书", "作者(可留空):")
        field = simpledialog.askstring("搜索图书", "领域(可留空):")
        result = self.library.search_books(author, field)
        if result:
            message = "搜索结果:\n"
            for title, details in result.items():
                message += f"《{title}》:{details['quantity']} 本,作者:{details['author']},领域:{details['field']}\n"
            messagebox.showinfo("搜索结果", message)
        else:
            messagebox.showinfo("搜索结果", "没有找到匹配的图书。")
    
    def logout(self):
        # 清除界面
        self.clear_ui()
        # 调用library的logout方法重置用户状态
        self.library.logout()
        # 重新显示登录界面
        self.login_screen()

    def clear_ui(self):
        # 清除当前root上的所有widget
        for widget in self.root.winfo_children():
            widget.destroy()

     我们最后用logout与clear_ui函数来实现返回到登录界面,用messagebox函数来实现对话框的内容提示,simpledialog函数来获取我们输入的信息

五、最后的实现

def main():
    root = tk.Tk()
    library = Library()
    app = LibraryGUI(root, library)
    root.mainloop()

if __name__ == "__main__":
    main()

三、功能视频

屏幕录制 2024-05-05 224631

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是一个简单图书管理系统程序示例,使用 Python 的 Tkinter 模块进行编写: ```python from tkinter import * import tkinter.messagebox as messagebox class Book: def __init__(self, name, author, category): self.name = name self.author = author self.category = category class Library: def __init__(self): self.books = [] def add_book(self, book): self.books.append(book) def remove_book(self, book): self.books.remove(book) def search_book(self, name): for book in self.books: if book.name == name: return book return None class GUI: def __init__(self, library): self.library = library self.window = Tk() self.window.title("图书管理系统") self.window.geometry("400x300") self.name_label = Label(self.window, text="书名:") self.name_label.grid(row=0, column=0) self.name_entry = Entry(self.window) self.name_entry.grid(row=0, column=1) self.author_label = Label(self.window, text="作者:") self.author_label.grid(row=1, column=0) self.author_entry = Entry(self.window) self.author_entry.grid(row=1, column=1) self.category_label = Label(self.window, text="分类:") self.category_label.grid(row=2, column=0) self.category_entry = Entry(self.window) self.category_entry.grid(row=2, column=1) self.add_button = Button(self.window, text="添加", command=self.add_book) self.add_button.grid(row=3, column=0) self.remove_button = Button(self.window, text="删除", command=self.remove_book) self.remove_button.grid(row=3, column=1) self.search_button = Button(self.window, text="搜索", command=self.search_book) self.search_button.grid(row=3, column=2) self.result_label = Label(self.window, text="") self.result_label.grid(row=4, column=0, columnspan=3) def add_book(self): name = self.name_entry.get() author = self.author_entry.get() category = self.category_entry.get() book = Book(name, author, category) self.library.add_book(book) self.result_label.config(text="添加成功") def remove_book(self): name = self.name_entry.get() book = self.library.search_book(name) if book: self.library.remove_book(book) self.result_label.config(text="删除成功") else: self.result_label.config(text="未找到该书") def search_book(self): name = self.name_entry.get() book = self.library.search_book(name) if book: self.result_label.config(text="书名:{} 作者:{} 分类:{}".format(book.name, book.author, book.category)) else: self.result_label.config(text="未找到该书") def run(self): self.window.mainloop() library = Library() gui = GUI(library) gui.run() ``` 这个程序实现了添加、删除和搜索图书的功能,使用了面向对象的编程方式,并使用了 Tkinter 模块进行界面设计。用户可以在界面中输入书名、作者和分类,并点击添加、删除和搜索按钮进行操作。程序会根据用户的操作,更新图书馆中的图书,并在界面中显示操作结果。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值