Urmați acest tutorial pentru a afla cum să construiți o aplicație de bază de gestionare a datelor cu o interfață GUI simplă.

Un sistem de împrumut de cărți este o modalitate foarte convenabilă pentru bibliotecari de a gestiona activitățile de inventar și de împrumut. Această aplicație simplă este ideală pentru biblioteci mici până la mari, centre comunitare, cluburi de carte și chiar și pentru colecția personală de cărți.

Scriind exemplul de aplicație, veți învăța despre cum să construiți o aplicație GUI multiplatformă, cum să utilizați clase și obiecte pentru a modela entități și cum să vă modularizați programele.

Instalarea Tkinter și crearea ecranului de autentificare/înregistrare utilizator

Pentru a construi sistemul de împrumut de cărți, veți folosi Tkinter. Tkinter este biblioteca standard GUI pentru aplicațiile desktop Python. Pentru a-l instala, tastați în terminal:

pip install tkinter

Puteți găsi întregul cod sursă al construirii unui sistem de împrumut de cărți pentru biblioteci în aceasta Depozitul GitHub.

Importați modulele necesare și definiți o clasă, Sistemul de împrumut de cărți. Definiți o metodă de constructor pentru clasă și inițializați fereastra rădăcină, setând titlul, dimensiunile și culoarea de fundal a aplicației. Definiți două liste, cărți și lend_list, pe care îl vei folosi pentru a stoca titlurile cărților și pe care le-au împrumutat oamenii.

Definiți un dicționar, record, pe care îl puteți folosi pentru a actualiza starea cărților. Folosește setup_gui() metodă de a crea interfața grafică cu utilizatorul și de a inițializa o listă goală, bibliotecari, pe care îl veți folosi pentru a stoca acreditările.

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

Definiți o metodă, setup_gui(). Pentru ecranul de înregistrare/autentificare, veți crea trei etichete numite login_label, username_label, și eticheta_parolă. Pentru fiecare etichetă, definiți elementul părinte în care doriți să îl plasați, textul pe care ar trebui să-l afișeze, stilul fontului pe care ar trebui să-l aibă împreună cu culoarea fontului.

Împreună cu etichetele, trebuie să creați două widget-uri de intrare numite username_entry și introducere_parolă pentru a obține și stoca acreditările bibliotecarului. Puteți construi o verificator de parole pentru a vă testa securitatea parolei cu Python. Folosește ambalaj managerul să organizeze toate aceste widget-uri și să adauge umplutura adecvată pentru atractivitatea vizuală.

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

Definiți o metodă, log in(). Folosește obține() metodă pe widget-ul de intrare pentru a extrage valoarea acreditărilor introduse de bibliotecar. Repetați lista de bibliotecari și verificați dacă numele de utilizator și parola se potrivesc cu valorile introduse. Dacă da, ștergeți valorile introduse de la început până la sfârșit. Distrugeți toate widget-urile pe care le-ați creat și apelați ecran_management_carte() metodă de afișare a ecranului de gestionare a sistemului de împrumut de cărți.

În caz contrar, datele de conectare sunt incorecte sau bibliotecarul nu s-a înregistrat. Afișați mesajul corespunzător prin intermediul widget-ului pentru caseta de mesaje Tkinter. În cazul în care vrei criptați parola, instalați modulul 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.")

Definiți o metodă, Inregistreaza-te(). Extrageți valoarea acreditărilor introduse de bibliotecar, adăugați-le la lista bibliotecarului și ștergeți complet intrările.

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)

Definiți o metodă, ecran_management_carte(). Creați patru etichete numite add_book_label, return_book_label, remove_book_label, și issue_book_label. Creați patru intrări și patru butoane corespunzătoare acestor etichete și un alt buton pentru a vizualiza lista tuturor cărților împreună cu starea acestora. Folosiți managerul de pachete pentru a organiza elementele și adăugați câteva umplutură.

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)

Construirea funcționalității sistemului de împrumut de cărți

Definiți o metodă, add_book(). Extrageți conținutul widget-ului de intrare și adăugați-l la lista de cărți. În dicționarul de înregistrare, adăugați cheia ca titlu al cărții și valoarea ca adăugat. Afișează o casetă de mesaj de succes care spune că programul a adăugat cartea cu succes. Ștergeți conținutul add_book_entry de la început până la sfârșit.

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)

Definiți o metodă, remove_book(). Extrageți titlul cărții și verificați dacă este prezent în cărți listă. Dacă există, eliminați-l și înregistrarea sa din dicționar. Odată terminat, afișați o casetă cu mesaj de succes care informează că programul a eliminat cartea. În caz contrar, afișați o casetă de mesaj de eroare care spune că cartea nu a fost găsită. Ștergeți intrarea remove_book_entry complet.

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)

Definiți o metodă, issue_book(). Extrageți titlul cărții și verificați dacă acesta există în cărți listă. Dacă da, adăugați acest lucru la lend_list listă și șterge-l din lista de cărți. Actualizați valoarea cărții ca emis. În caz contrar, afișați o casetă de mesaj de eroare care spune că cartea nu a fost găsită. Ștergeți conținutul 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)

Definiți o metodă, return_book(). Extrageți titlul și verificați dacă acesta există în lend_list listă. Dacă da, eliminați-l și adăugați-l înapoi la lista de cărți și actualizați valoarea din înregistrare așa cum a fost returnată. Afișați o casetă de mesaj de succes care să arate că persoana respectivă a returnat cartea.

Dacă titlul există în lista de cărți și starea înregistrării este citită adăugat, afișați o casetă de mesaj de eroare care spune că persoana respectivă nu poate returna cartea, deoarece nimeni nu a emis-o. În caz contrar, afișați o casetă de mesaj de eroare care spune că cartea nu a fost găsită.

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)

Definiți o metodă, view_books(). Inițializați mesaj variabilă ca goală. Construiți mesajul pentru a efectua interpolarea șirurilor și afișați titlul cărților împreună cu starea acestora. Dacă mesajul este gol, nu există cărți disponibile. Afișați rezultatul corespunzător într-o casetă de mesaj.

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)

Creați o instanță a clasei și rulați Tkinter mainloop() pentru a asculta evenimentele până când închideți fereastra. Utilizare cel __name__ == „__principal__” idiom pentru a rula programul.

defrun(self):
self.master.mainloop()

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

Exemplu de ieșire a sistemului de împrumut de cărți

La rularea programului, acesta vă întâmpină cu un ecran de înregistrare/autentificare. La introducerea acreditărilor și făcând clic pe Inregistreaza-te butonul, programul vă adaugă ca bibliotecar. Introduceți aceleași acreditări și apăsând Log in vă va naviga la ecranul de gestionare.

La introducerea titlului cărții și apăsând pe Adăugare carte, programul afișează o casetă de mesaj că a adăugat cartea cu succes. Dacă faceți clic pe butonul de problemă, returnare sau eliminare, programul afișează caseta de mesaj corespunzătoare în timp ce actualizează starea.

Făcând clic pe Vizualizați cărți butonul, programul afișează titlul cărților împreună cu starea acestora. Dacă eliminați o carte, programul șterge titlul și nu o puteți vizualiza.

În cazul în care încercați să returnați o carte fără a o elibera sau a elimina o carte în timp ce este emisă, programul afișează o casetă de mesaj de eroare.

Îmbunătățirea aplicației de împrumut de cărți

Această implementare este o bază pentru construirea unei aplicații GUI securizate la nivel de producție. Puteți îmbunătăți funcționalitatea acestuia prin implementarea validării intrărilor, folosind hashlib pentru a stoca parole, implementând gestionarea corectă a erorilor și adăugând persistența datelor cu o bază de date.

În afară de aceasta, ar trebui să implementați niveluri de autentificare a utilizatorilor cu diferite niveluri de acces pentru cititori, bibliotecari și administratori. Puteți adăuga funcționalitate de căutare pentru a căuta cărți și pentru a facilita accesul.