Contents

Crie um sistema de empréstimo de livros para bibliotecas usando Python

Um sistema de empréstimo de livros serve como um meio eficiente para os profissionais da biblioteca supervisionarem o inventário e as transações de empréstimos aos clientes. Adequado para coleções modestas e extensas, este aplicativo simplificado atende a uma ampla gama de instituições, como bibliotecas públicas, centros comunitários, encontros literários e até acervos bibliográficos privados.

Ao desenvolver o aplicativo de amostra, você entenderá o processo envolvido na criação de uma interface gráfica de usuário multiplataforma, bem como a utilização de classes e objetos para representar várias entidades dentro do programa. Além disso, o conceito de código modular também será explorado.

Instalando o Tkinter e Construindo a Tela de Login/Cadastro de Usuário

Para construir a plataforma de empréstimo de livros usando o Tkinter, que serve como a biblioteca de interface gráfica do usuário (GUI) padrão para aplicativos de desktop baseados em Python, deve-se executar um comando em seu terminal para facilitar a instalação.

 pip install tkinter 

A base de código completa para desenvolver um sistema de empréstimo de biblioteca está disponível no GitHub, acessível por meio do link fornecido.

Para implementar a funcionalidade descrita no prompt, primeiro importamos os módulos necessários e depois criamos uma nova classe chamada BookBorrowingSystem. Essa classe tem um método construtor que inicializa vários componentes importantes do nosso programa, incluindo o título, as dimensões e a cor de fundo da janela raiz. Além disso, criamos duas listas denominadas books e lend\_list , que são utilizadas para rastrear os títulos dos livros e aqueles que foram emprestados pelos usuários, respectivamente.

Crie um dicionário chamado “library\_management\_system” com os seguintes pares chave-valor:arduino"books": [], # Esta é uma lista vazia que será usada para armazenar informações sobre a coleção de livros da biblioteca.“ librarian_credentials”: ​​[] # Esta é uma lista vazia que será usada para armazenar as credenciais de login para cada bibliotecário que usa o sistema. Use a função setup\_gui() do tkinter para configurar a janela GUI e inicializar uma lista vazia chamada “bibliotecários”. Você usará esta lista para armazenar as credenciais de login para cada bibliotecário que acessa o sistema.

 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 = []

Para configurar a interface gráfica do usuário para nosso aplicativo, devemos implementar uma função chamada setup\_gui(). Esta função é responsável por criar os elementos necessários para as telas de cadastro e login. Especificamente, precisamos gerar três rótulos para essas telas, que são os seguintes: css[ ‘username_label’, ‘password_label’] Para cada um desses rótulos, devemos especificar seu contêiner pai, conteúdo, estilo de fonte e cor. Os detalhes exatos da implementação podem variar dependendo dos requisitos específicos do seu projeto.

Para facilitar a autenticação do usuário, é necessário incorporar dois campos de entrada, a saber, “username\_entry” e “password\_entry”, no layout da GUI. Esses elementos permitirão que os usuários insiram suas informações de login com segurança. Para garantir que as senhas sejam seguras, pode-se utilizar a função “empacotar” integrada no Tkinter para organizar esses componentes de forma eficiente enquanto aplica preenchimento adequado para uma aparência esteticamente agradável.

     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)

        # Similarly, create the username_label, username_entry, password_label,
       # password_entry, and the register button 

Para implementar a funcionalidade de login para o sistema de empréstimo de livros de nossa biblioteca, definiremos um método chamado login() que executa as seguintes etapas:1. Utilize o método get() do widget de entrada para recuperar a entrada fornecida pelo bibliotecário encarregado de gerenciar os livros. Esta informação inclui seu nome de usuário e senha.2. Percorra uma lista predefinida de pessoal autorizado que tem acesso ao sistema, comparando as credenciais recebidas com aquelas armazenadas na lista. No caso de uma correspondência bem-sucedida, procederemos com o apagamento de todos os dados inseridos anteriormente no aplicativo, começando do início até chegar ao campo atual com o qual está interagindo.3. Depois que a autenticação válida for estabelecida, é necessário descartar todos os componentes da interface do usuário gerados durante esse processo, incluindo campos de texto e botões. Finalmente, nós

Verifique se suas credenciais de login estão corretas e se o bibliotecário foi devidamente registrado. Se houver um problema com qualquer um desses fatores, uma mensagem será exibida por meio do widget da caixa de mensagens Tkinter. Como alternativa, se você deseja armazenar sua senha com segurança usando criptografia, instale o módulo bcrypt.

     def login(self):
        username = self.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()

                # Destroy all the entries, labels, and buttons

                self.book_management_screen()
                return

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

Claro! Aqui está um exemplo de implementação em Python usando a estrutura da Web Flask para lidar com o registro do usuário: pythonfrom flask import Flask, request, jsonifyimport jwtapp=Flask( name )jwk_public={…} # chave pública usada para assinar tokens JWTslibrarians=[] # lista de registrado [email protected] (’/register’, methods=[‘POST’])def register(): data=request.get_json() if not data or’email’não está nos dados ou’senha’não está nos dados: return jsonify({’error’:‘Campos obrigatórios ausentes.’}), 400 email=data[’email’] password=data[‘password’] if

     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) 

, , e . A seguir, criaremos quatro campos de entrada e quatro botões correspondentes a cada etiqueta. Por fim, incluiremos um botão adicional para mostrar uma lista de todos os livros junto com seus respectivos status. Para organizar esses elementos visualmente, utilizaremos o

     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)

        # Repeat the same for 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) 

Construindo a Funcionalidade do Sistema de Empréstimo de Livros

Claro! Aqui está um exemplo de implementação em Python para adicionar um novo livro usando um widget Entry e exibindo uma mensagem de sucesso após clicar no botão “Adicionar”: pythonimport tkinter as tkfrom tkinter import messageboxclass BookCSVApp(tk.Tk): def init (self): super (). init () # cria os componentes da IU self.title(“Book CSV Creator”) self.geometry(“600x400”) self.title_font=(“Arial”, 18) self.title_text=“Book CSV Creator” # cria a entrada frame input_frame=ttk.Frame(self, padding=20)

     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) 

Claro! Aqui está minha tentativa de parafrasear seu texto em um inglês mais formal:> Crie uma função chamada “remove\_book” que executará as seguintes etapas:> 1. Recupere o título do livro especificado pelo usuário.> 2. Pesquise o título do livro na lista de “livros”.> 3. Se o livro for encontrado, exclua o livro e seus dados correspondentes do dicionário.> 4. Exiba uma notificação para confirmar a remoção bem-sucedida do livro. Caso o livro não seja encontrado, mostre uma mensagem de erro indicando tal.> 5. Apague todas as informações inseridas no campo de entrada para remover um livro.

     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) 

Para implementar efetivamente a funcionalidade descrita acima, vamos definir um método chamado issue\_book() que executa as operações necessárias para a emissão de um livro. Este método começa extraindo o título do livro que está sendo solicitado e depois verifica se ele está ou não presente na lista livros. Se o livro estiver realmente localizado na lista, ele será anexado à lista lend\_list e subsequentemente removido da lista books. Além disso, o status do livro é atualizado para refletir seu estado atual como “emitido”. No entanto, se o livro não for encontrado na lista books, uma mensagem de erro será exibida através do uso de uma caixa de erro. Após esses eventos, qualquer informação inserida anteriormente no método issue\_book\_entry() será limpa em preparação para uso futuro.

     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) 

Aqui está um exemplo de como você pode definir uma função Python chamada return\_book() que executa as ações descritas acima:pythondef return_book(): # Obtenha a entrada do usuário para o ID do livro ou escaneie o código de barras manualmente com print(“Enter book ID or Scan Código de barras manualmente: “) user_input=input(“Digite o ID do livro ou digitalize o código de barras manualmente: “).strip().upper() if not any(char.isdigit() for char in user_input): print(“Invalid Input”) return # Verifique se o livro com o ID fornecido existe nas listas de registros de empréstimos e registros de empréstimos found_in_lending=False found_in_borrowing=False para mutuário, id_, data

Se um livro com o título especificado aparecer nos registros de nossa biblioteca e seu status associado indicar que foi “adicionado”, uma mensagem apropriada será exibida para informar ao usuário que ele não pode prosseguir com a devolução do livro, pois nunca foi realmente verificado por qualquer outra pessoa. Por outro lado, se o título não existir ou não estiver disponível em nosso sistema, uma mensagem diferente aparecerá para notificar o usuário desse fato.

     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) 

Para transmitir efetivamente informações sobre a disponibilidade de livros, é essencial implementar um método conhecido como view\_books(). Antes de iniciar este processo, é imperativo inicializar uma variável de mensagem vazia. O objetivo desta variável de mensagem é facilitar a incorporação de dados dinâmicos através da interpolação de strings, resultando na apresentação de títulos de livros acompanhados de seus respectivos status. Se o conteúdo da variável de mensagem permanecer vago, significa que nenhum livro está disponível no momento para leitura. Nesses casos, torna-se necessário exibir a notificação apropriada em uma caixa de mensagem, informando assim o usuário sobre o estado atual do sistema.

     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) 

Para executar um aplicativo Tkinter, é necessário criar uma instância da classe relevante e iniciar o loop principal Tkinter chamando o método mainloop(). Isso permitirá que o programa detecte e responda a eventos gerados pelo usuário até que a janela seja fechada. O uso do idioma \_\_name\_\_=="\_\_main\_\_" é tipicamente empregado para facilitar a execução do programa.

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

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

Saída de Exemplo do Sistema de Empréstimo de Livros

Após a execução do programa, uma tela inicial de boas-vindas é apresentada com uma interface de registro/login. Ao inserir as informações de login necessárias e selecionar a opção “Registrar”, o aplicativo o inscreve imediatamente como membro da equipe da biblioteca. Ao reinserir os detalhes de autenticação fornecidos anteriormente e escolher o recurso “Login”, o usuário obtém acesso ao painel de administração.

/pt/images/start-screen-of-book-borrowing-system.jpg

Ao clicar em “Adicionar livro” e posteriormente inserir os dados do livro, o aplicativo exibirá uma mensagem de confirmação em uma caixa de diálogo para indicar que a operação foi concluída sem problemas. Se você optar por interagir com outras funcionalidades, como emissão, devolução ou remoção de livros de sua biblioteca, mensagens de notificação adicionais serão exibidas em seus respectivos contextos, fornecendo um relato atualizado do estado atual das coisas.

/pt/images/book-added-in-book-borrowing-system.jpg

Ao clicar no botão “Visualizar Livros”, o software apresenta uma lista de títulos acompanhada de seus respectivos estados. No caso de um livro ser removido, seu título fica inacessível para exibição.

/pt/images/view-book-with-their-status-in-book-borrowing-system.jpg

No caso de você tentar revogar um livro sem primeiro obter a posse dele ou remover um livro de circulação quando ainda está emprestado, o sistema irá gerar e exibir uma mensagem de erro em uma janela designada.

/pt/images/book-returned-without-issue-error.jpg

Aprimorando o aplicativo de empréstimo de livros

Incorporar medidas de segurança robustas, como validação de entrada, utilizar funções de hash criptográfico da biblioteca hashlib para proteger informações confidenciais, como armazenamento de senhas, implementar mecanismos eficazes de tratamento de erros e incorporar armazenamento persistente de dados por meio da integração com um sistema de gerenciamento de banco de dados relacional são etapas essenciais para o desenvolvimento um aplicativo de interface gráfica do usuário confiável e seguro em nível de produção que pode ser implantado em ambientes de missão crítica.

Além dos recursos mencionados, é altamente recomendável incorporar níveis de autenticação de usuário com diversas permissões para leitores, bibliotecários e administradores de sistema. Além disso, considere a integração de recursos avançados de pesquisa, permitindo que os usuários localizem e recuperem facilmente os títulos desejados no catálogo da biblioteca.