Acompanhe este tutorial para aprender como criar um aplicativo básico de gerenciamento de dados com um front-end GUI simples.
Um sistema de empréstimo de livros é uma maneira super conveniente para os bibliotecários gerenciarem as atividades de estoque e empréstimo. Este aplicativo simples é ideal para pequenas e grandes bibliotecas, centros comunitários, clubes do livro e até mesmo para sua coleção pessoal de livros.
Ao escrever o aplicativo de amostra, você aprenderá como criar um aplicativo GUI multiplataforma, como usar classes e objetos para modelar entidades e como modularizar seus programas.
Instalando o Tkinter e Construindo a Tela de Login/Registro do Usuário
Para construir o sistema de empréstimo de livros, você fará uso do Tkinter. Tkinter é a biblioteca GUI padrão para aplicativos de desktop Python. Para instalá-lo, digite no terminal:
pip install tkinter
Você pode encontrar todo o código-fonte da construção de um sistema de empréstimo de livros para bibliotecas neste Repositório GitHub.
Importe os módulos necessários e defina uma classe, Sistema de Empréstimo de Livros. Defina um método construtor para a classe e inicialize a janela raiz, definindo o título, as dimensões e a cor de fundo do aplicativo. Defina duas listas, livros e lend_list, que você usará para armazenar os títulos dos livros e quais foram emprestados pelas pessoas.
Definir um dicionário, registro, que você pode usar para atualizar o status dos livros. Use o setup_gui() método para criar a interface gráfica do usuário e inicializar uma lista vazia, bibliotecários, que você usará para armazenar as credenciais.
import tkinter as tk
from tkinter import messagebox
classBookBorrowingSystem:
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 = []
Defina um método, setup_gui(). Para a tela de cadastro/login, você criará três etiquetas chamadas login_label, username_label, e password_label. Para cada rótulo, defina o elemento pai no qual deseja colocá-lo, o texto que deve exibir, o estilo de fonte que deve ter junto com a cor da fonte.
Juntamente com os rótulos, você precisa criar dois widgets de entrada chamados username_entry e password_entry para obter e armazenar as credenciais do bibliotecário. Você pode construir um verificador de senha para testar sua segurança de senha com Python. Use o pacote gerente para organizar todos esses widgets e adicionar o preenchimento apropriado para apelo visual.
defsetup_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
Defina um método, Conecte-se(). Use o pegar() no widget de entrada para extrair o valor das credenciais inseridas pelo bibliotecário. Repita a lista de bibliotecários e verifique se o nome de usuário e a senha correspondem aos valores inseridos. Se sim, limpe os valores inseridos do início ao fim. Destrua todos os widgets que você criou e chame o book_management_screen() para exibir a tela de gerenciamento do sistema de empréstimo de livros.
Caso contrário, as credenciais de login estão incorretas ou o bibliotecário não foi registrado. Exiba a mensagem apropriada por meio do widget da caixa de mensagens do Tkinter. Caso você queira criptografe sua senha, instale o módulo bcrypt.
deflogin(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.")
Defina um método, registro(). Extraia o valor das credenciais inseridas pelo bibliotecário, adicione-as à lista do bibliotecário e limpe completamente as entradas.
defregister(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)
Defina um método, book_management_screen(). Crie quatro rótulos nomeados add_book_label, return_book_label, remove_book_label, e issue_book_label. Crie quatro entradas e quatro botões correspondentes a esses rótulos e outro botão para visualizar a lista de todos os livros junto com seus status. Use o gerenciador de pacotes para organizar os elementos e adicionar algum preenchimento.
defbook_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
Defina um método, add_book(). Extraia o conteúdo do widget de entrada e adicione-o à lista de livros. No dicionário de registros, adicione a chave como o título do livro e o valor como adicionado. Exiba uma caixa de mensagem de sucesso informando que o programa adicionou o livro com sucesso. Limpar o conteúdo do add_book_entry do começo ao fim.
defadd_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)
Defina um método, remove_book(). Extraia o título do livro e verifique se ele está presente no livros lista. Se existir, remova-o e seu registro do dicionário. Feito isso, exiba uma caixa de mensagem de sucesso informando que o programa removeu o livro. Caso contrário, exiba uma caixa de mensagem de erro informando que o livro não foi encontrado. Limpe a entrada do remove_book_entry completamente.
defremove_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)
Defina um método, livro_edição(). Extraia o título do livro e verifique se ele existe no livros lista. Se sim, anexe isso ao lend_list list e removê-lo da lista de livros. Atualize o valor do livro como publicado. Caso contrário, exiba uma caixa de mensagem de erro informando que o livro não foi encontrado. Limpe o conteúdo do issue_book_entry().
defissue_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)
Defina um método, return_book(). Extraia o título e verifique se ele existe no lend_list lista. Em caso afirmativo, remova-o e anexe-o novamente à lista de livros e atualize o valor no registro conforme retornado. Exiba uma caixa de mensagem de sucesso informando que a pessoa devolveu o livro.
Se o título existir na lista de livros e o status do registro for adicionado, exibe uma caixa de mensagem de erro informando que a pessoa não pode devolver o livro porque ninguém o emitiu. Caso contrário, exiba uma caixa de mensagem de erro informando que o livro não foi encontrado.
defreturn_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)
Defina um método, ver_livros(). Inicialize o mensagem variável como vazia. Construa a mensagem para executar a interpolação de string e exibir o título dos livros junto com seu status. Se a mensagem estiver vazia, não há livros disponíveis. Exiba a saída correspondente em uma caixa de mensagem.
defview_books(self):
message = ""for book, status in self.record.items():
message += f"{book}: {status}\n"ifnot message:
message = "No book records available."
messagebox.showinfo("Books", message)
Crie uma instância da classe e execute o Tkinter circuito principal() para ouvir eventos até fechar a janela. Usar o __name__ == "__main__" idioma para executar o programa.
defrun(self):
self.master.mainloop()
if __name__ == "__main__":
book_borrowing_system = BookBorrowingSystem()
book_borrowing_system.run()
Exemplo de Saída do Sistema de Empréstimo de Livros
Ao executar o programa, ele o cumprimenta com uma tela de registro/login. Ao inserir as credenciais e clicar no botão Registro botão, o programa adiciona você como bibliotecário. Inserindo as mesmas credenciais e pressionando Conecte-se irá levá-lo para a tela de gerenciamento.
Ao inserir o título do livro e clicar em Adicionar livro, o programa exibe uma caixa de mensagem informando que adicionou o livro com sucesso. Se você clicar no botão emitir, retornar ou remover, o programa exibirá a caixa de mensagem apropriada enquanto atualiza o status.
Ao clicar no Ver livros botão, o programa exibe o título dos livros junto com seu status. Se você remover um livro, o programa excluirá o título e você não poderá visualizá-lo.
Caso você tente devolver um livro sem emiti-lo ou remover um livro durante a emissão, o programa exibe uma caixa de mensagem de erro.
Melhorando o aplicativo de empréstimo de livros
Essa implementação é uma base para a construção de um aplicativo GUI seguro em nível de produção. Você pode aprimorar sua funcionalidade implementando validação de entrada, usando hashlib para armazenar senhas, implementando tratamento de erros adequado e adicionando persistência de dados com um banco de dados.
Além disso, você deve implementar níveis de autenticação de usuário com níveis variados de acesso para leitores, bibliotecários e administradores. Você pode adicionar funcionalidade de pesquisa para pesquisar livros e facilitar o acesso.