Cách tạo hệ thống mượn sách thư viện bằng Python

Hệ thống mượn sách giúp thủ thư thuận tiện quản lý sách và hoạt động mượn sách trong thư viện. Dưới đây là hướng dẫn cách tạo hệ thống mượn sách thư viện bằng Python.

Quản lý thư viện bằng Python

Cài đặt Tkinter và xây dựng màn hình đăng nhập/đăng ký cho người dùng

Để xây dựng hệ thống mượn sách, bạn sẽ dùng Tkinter. Tkinter là thư viện GUI chuẩn cho ứng dụng desktop Python. Để cài đặt nó, gõ code sau vào terminal:

pip install tkinter

Nhập mô đun cần thiết và xác định một class, BookBorrowingSystem. Xác định một phương thức khởi tạo cho class và cửa sổ gốc, đặt tiêu đề, kích thước và màu nền cho ứng dụng. Xác định hai danh sách, bookslend_list, bạn sẽ dùng nó để lưu tiêu đề của sách và sách đã được mượn.

Xác định một từ điển, record, mà bạn có thể dùng để update trạng thái của sách. Dùng phương thức setup_gui() để tạo giao diện người dùng đồ họa và khởi tạo một danh sách trống, librarians mà bạn sẽ dùng để lưu trữ thông tin đăng nhập.

import tkinter as tk
from tkinter import messagebox

class BookBorrowingSystem:
    def __init__(self):
        self.master = tk.Tk()
        self.master.title("Book Borrowing System")
        self.master.geometry("750x600")
        self.master.config(bg='#708090')
        self.books = []
        self.lend_list = []
        self.record = {}
        self.setup_gui()
        self.librarians = []

Xác định một phương thức, setup_gui(). Đối với màn hình đăng ký/đăng nhập, bạn sẽ tạo 3 nhãn tên login_label, username_label, và password_label. Đối với mỗi nhãn, xác định thành phần gốc bạn muốn đặt nó vào bên trong, text mà nó sẽ hiện, bao gồm cả kiểu và màu font.

Cùng với các label, bạn cần tạo 2 widget đầu vào tên username_entry password_entry để nhận và lưu trữ thông tin đăng nhập của thủ thư. Dùng trình quản lý pack để sắp xếp tất cả những widget này và thêm padding phù hợp tạo điểm nhấn thị giác.

    def setup_gui(self):
        self.login_label = tk.Label(self.master, text="Book Borrowing System", font=("Helvetica", 24), bg='#708090', fg='white')
        self.login_label.pack(pady=(30, 10))
        self.login_button = tk.Button(self.master, text="Login", command=self.login, font=("Helvetica", 14)) 
        self.login_button.pack(pady=10) 

       # Tương tự, tạo username_label, username_entry, password_label,
       # password_entry, và nút bấm register

Định nghĩa một phương thức, login(). Dùng get() trên widget đầu vào để truy xuất giá trị thông tin đăng nhập mà thủ thư nhập vào. Lặp lại danh sách thủ thư và kiểm tra xem liệu tên người dùng và mật khẩu có khớp với dữ liệu đã nhập. Nếu đúng, xóa giá trị đã nhập từ lúc bắt đầu tới khi kết thúc. Hủy tất cả widget đã tạo và gọi book_management_screen() để hiện màn hình quản lý của hệ thống mượn sách.

Trường hợp khác, thông tin đăng nhập sai hoặc thủ thư chưa đăng ký. Hiện thông báo phù hợp qua widget box thông báo của Tkinter. Trong trường hợp bạn muốn mã hóa mật khẩu, hãy cài đặt mô đun bcrypt.

elf.username_entry.get()
        password = self.password_entry.get()

        for librarian in self.librarians:
            if username == librarian[0] and password == librarian[1]:
                self.username_entry.delete(0, tk.END)
                self.password_entry.delete(0, tk.END)
                self.login_label.destroy()

                # Phá hủy toàn bộ entries, labels, và buttons

                self.book_management_screen()
                return

        messagebox.showerror("Error", "Invalid username or password. Please register if not done already.")

Xác định một phương thức, register(). Truy xuất giá trị thông tin đăng nhập mà thủ thư nhập vào, thêm chúng vào danh sách của thủ thư và xóa hoàn toàn các mục nhập.

    def register(self):
        username = self.username_entry.get()
        password = self.password_entry.get()
        self.librarians.append([username, password])
        self.username_entry.delete(0, tk.END)
        self.password_entry.delete(0, tk.END)

Xác định một phương thức, book_management_screen(). Tạo 4 nhãn tên add_book_label, return_book_label, remove_book_label, và issue_book_label. Tạo 4 mục và 4 nút bấm tương ứng với những nhãn này, và nút bấm khác để xem danh sách toàn bộ sách cùng trạng thái của chúng. Dùng trình quản lý gói để sắp xếp các phần tử và thêm một chút padding.

    def book_management_screen(self):
        self.add_book_label = tk.Label(self.master, text="Add Book", font=("Helvetica", 18), bg='#708090', fg='white')
        self.add_book_label.pack(pady=(20, 5))
        self.add_book_entry = tk.Entry(self.master, font=("Helvetica", 14))
        self.add_book_entry.pack()
        self.add_book_button = tk.Button(self.master, text="Add Book", command=self.add_book, font=("Helvetica", 14))
        self.add_book_button.pack(pady=5)

        # Lặp lại code tương tự cho return_book, remove_book, issue_book

        self.view_books_button = tk.Button(self.master, text="View Books", command=self.view_books, font=("Helvetica", 14))
        self.view_books_button.pack(pady=10)

Xây dựng chức năng cho hệ thống mượn sách

Xác định một hàm, add_book(). Truy xuất nội dụng của widget đầu vào và thêm nó vào danh sách. Ở từ điển record, thêm từ khóa làm tiêu đề sách và giá trị dưới dạng added. Hiện một box thông báo thành công cho biết chương trình đã hoàn thành việc thêm sách. Xóa nội dung của add_book_entry từ đầu tới cuối.

    def add_book(self):
        book = self.add_book_entry.get()
        self.books.append(book)
        self.record[book] = "added"
        messagebox.showinfo("Success", "Book added successfully")
        self.add_book_entry.delete(0, tk.END)

Xác định một phương thức, remove_book(). Truy xuất tiêu đề sách và kiểm tra xem liệu nó có hiện trong danh sách books hay không. Nếu tồn tại, hãy loại bỏ nó và các bản ghi tương ứng khỏi từ điển. Sau khi hoàn thành, hiện một hộp thoại thông báo thành công cho biết chương trình đó đã loại bỏ cuốn sách đó. Nếu không, hiện box thông báo lỗi cho biết không tìm thấy cuốn sách đó. Xóa hoàn toàn mục nhập remove_book_entry.

    def remove_book(self):
        book = self.remove_book_entry.get()

        if book in self.books:
            self.books.remove(book)

            if book in self.record:
                del self.record[book]

            messagebox.showinfo("Success", "Book removed successfully")
        else:
            messagebox.showerror("Error", "Book not found")

        self.remove_book_entry.delete(0, tk.END)

Xác định một phương thức, issue_book(). Truy xuất tên sách và kiểm tra xem nó có tồn tại trong danh sách books. Nếu đúng, hãy gắn nó vào danh sách sách. Update giá trị sách là issued. Nếu không, hiện box thông báo lỗi cho biết không tim thấy sách đó. Xóa nội dung của issue_book_entry().

    def issue_book(self):
        book = self.issue_book_entry.get()

        if book in self.books:
            self.lend_list.append(book)
            self.books.remove(book)
            self.record[book] = "issued"
            messagebox.showinfo("Success", "Book issued successfully")
        else:
            messagebox.showerror("Error", "Book not found")

        self.issue_book_entry.delete(0, tk.END)

Xác định một phương thức return_book(). Truy xuất tiêu đề và kiểm tra xem nó có tồn tại trong danh sách lend_list. Nếu có, loại bỏ nó và gắn nó trở lại danh sách sách & update giá trị trong bản ghi là returned. Hiện box thông báo rằng người mượn đã trả sách.

Nếu tên sách đã tồn tại trong danh sách và trạng thái của bản ghi đọc added, hiện box thông báo lỗi cho biết người đó không thể trả lại sách vì chưa ai tiếp nhận. Nếu không, hiển thị hộp thông báo lỗi nói rằng không tìm thấy sách.

    def return_book(self):
        book = self.return_book_entry.get()

        if book in self.lend_list:
            self.lend_list.remove(book)
            self.books.append(book)
            self.record[book] = "returned"
            messagebox.showinfo("Success", "Book returned successfully")
        elif book in self.books and self.record.get(book) == "added":
            messagebox.showerror("Error", "Book can't be returned. It hasn't been issued.")
        else:
            messagebox.showerror("Error", "Book not found.")

        self.return_book_entry.delete(0, tk.END)

Định nghĩa một phương thức, view_books(). Khởi tạo biến message là trống. Tạo thông báo thực hiện phép nội suy chuỗi và hiện tên sách cùng với trạng thái của nó. Nếu thông báo trống, hiện không có sẵn sách. Hiện kết quả tương ứng trong một box thông báo.

    def view_books(self):
        message = ""

        for book, status in self.record.items():
            message += f"{book}: {status}\n"

        if not message:
            message = "No book records available."

        messagebox.showinfo("Books", message)

Tạo một phiên bản class và chạy mainloop() Tkinter để lắng nghe sự kiện cho tới khi bạn đóng cửa sổ. Dùng __name__ == "__main__" để chạy chương trình này.

    def run(self):
        self.master.mainloop()

if __name__ == "__main__":
    book_borrowing_system = BookBorrowingSystem()
    book_borrowing_system.run()

Kết quả của ví dụ trên:

Màn hình đăng nhập khi chạy chương trình. Nhập thông tin và click nút Register, chương trình sẽ thêm bạn làm thủ thư. Nhập cùng thông tin đó và nhấn Login sẽ đưa bạn tới màn hình quản lý.

Màn hình quản lý mượn sách

Khi nhập tên sách và nhấn Add Book, chương trình hiện một box thông báo đã thêm sách thành công. Nếu click vào nút issue, return hay remove, chương trình hiện hộp thoại thông báo phù hợp trong khi cập nhật trạng thái của nó.

Thông báo sách đã được thêm thành công

Khi click nút View Books, chương trình hiện tên sách cùng với trạng thái của nó. Nếu loại bỏ sách, chương trình xóa tên và bạn không thể xem nó.

Thông báo không thể xem sách

Trường hợp bạn trả sách chưa phát hành hay xóa sách đã phát hành, chương trình sẽ hiện thông báo lỗi.

Thông báo lỗi

Trên đây là cách lập trình hệ thống quản lý mượn sách cho thư viện bằng Python. Hi vọng bài viết hữu ích với các bạn.

Thứ Tư, 09/08/2023 16:48
51 👨 618
0 Bình luận
Sắp xếp theo
    ❖ Python