با این آموزش همراه باشید تا یاد بگیرید که چگونه یک برنامه مدیریت داده اولیه با یک رابط کاربری گرافیکی ساده بسازید.
سیستم امانتگیری کتاب راهی بسیار راحت برای کتابداران برای مدیریت موجودی و فعالیتهای امانتگیری است. این برنامه ساده برای کتابخانه های کوچک تا بزرگ، مراکز اجتماعی، باشگاه های کتاب و حتی برای مجموعه کتاب های شخصی شما ایده آل است.
با نوشتن برنامه نمونه، در مورد نحوه ساخت یک برنامه رابط کاربری گرافیکی متقابل پلتفرم، نحوه استفاده از کلاسها و اشیاء برای مدلسازی موجودیتها و نحوه ماژولار کردن برنامههای خود یاد خواهید گرفت.
نصب Tkinter و ساخت صفحه ورود / ثبت نام کاربر
برای ساختن سیستم امانت گرفتن کتاب، از Tkinter استفاده خواهید کرد. Tkinter کتابخانه استاندارد رابط کاربری گرافیکی برای برنامه های دسکتاپ پایتون است. برای نصب آن، در ترمینال تایپ کنید:
pip install tkinter
میتوانید کل کد منبع ساخت یک سیستم امانتگیری کتاب برای کتابخانهها را در این مخزن GitHub بیابید.
ماژول های مورد نیاز را وارد کنید و یک کلاس BookBorrowingSystem تعریف کنید. یک متد سازنده برای کلاس تعریف کنید و پنجره ریشه را مقداردهی اولیه کنید، عنوان، ابعاد و رنگ پس زمینه برنامه را تنظیم کنید. دو لیست books و lend_list را تعریف کنید که از آنها برای ذخیره عناوین کتاب ها و اینکه افراد قرض گرفته اند استفاده می کنید.
یک فرهنگ لغت، ضبط، تعریف کنید که بتوانید از آن برای به روز رسانی وضعیت کتاب ها استفاده کنید. از متد setup_gui() برای ایجاد رابط کاربری گرافیکی و مقداردهی اولیه یک لیست خالی، کتابخانهها، استفاده کنید که برای ذخیره اعتبار استفاده میکنید.
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 = []
یک متد تعریف کنید، setup_gui(). برای صفحه ثبت نام/ورود، سه برچسب به نامهای login_label، username_label و password_label ایجاد خواهید کرد. برای هر برچسب، عنصر اصلی را که میخواهید در آن قرار دهید، متنی که باید نمایش داده شود، سبک قلمی که باید داشته باشد و رنگ فونت را مشخص کنید.
همراه با برچسبها، باید دو ویجت ورودی به نامهای username_entry و password_entry ایجاد کنید تا اعتبار کتابدار را دریافت و ذخیره کنید. شما می توانید یک جستجوگر رمز عبور برای آزمایش امنیت رمز عبور خود با پایتون بسازید. از مدیر بسته برای سازماندهی تمام این ویجت ها و اضافه کردن بالشتک مناسب برای جذابیت بصری استفاده کنید.
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
یک متد تعریف کنید، login(). از متد get() در ویجت ورودی برای استخراج مقدار اعتبارنامه های وارد شده توسط کتابدار استفاده کنید. فهرست کتابداران را تکرار کنید و بررسی کنید که آیا نام کاربری و رمز عبور با مقادیر وارد شده مطابقت دارند یا خیر. اگر بله، مقادیر وارد شده را از ابتدا تا انتها پاک کنید. تمام ویجت هایی که ایجاد کرده اید را از بین ببرید و متد ()book_management_screen را فراخوانی کنید تا صفحه مدیریت سیستم امانت کتاب نمایش داده شود.
در غیر این صورت، اعتبار ورود نادرست است، یا کتابدار ثبت نام نکرده است. پیام مناسب را از طریق ویجت جعبه پیام Tkinter نمایش دهید. اگر می خواهید رمز عبور خود را رمزگذاری کنید، ماژول 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.")
یک متد تعریف کنید، register(). ارزش اعتبارنامه هایی را که کتابدار وارد می کند استخراج کنید، آنها را به لیست کتابدار اضافه کنید و ورودی ها را کاملاً پاک کنید.
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)
یک متد تعریف کنید، book_management_screen(). چهار برچسب به نامهای add_book_label، return_book_label، remove_book_label و issue_book_label ایجاد کنید. چهار ورودی و چهار دکمه مربوط به این برچسبها و یک دکمه دیگر برای مشاهده فهرست همه کتابها به همراه وضعیت آنها ایجاد کنید. از مدیر بسته برای سازماندهی عناصر و اضافه کردن مقداری بالشتک استفاده کنید.
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)
ایجاد کارکرد سیستم امانتگیری کتاب
یک متد تعریف کنید، add_book(). محتوای ویجت ورودی را استخراج کنید و آن را به لیست کتاب ها اضافه کنید. در فرهنگ لغت رکورد، کلید را به عنوان عنوان کتاب و مقدار را به عنوان اضافه شده اضافه کنید. یک جعبه پیام موفقیت را نشان دهید که می گوید برنامه با موفقیت کتاب را اضافه کرده است. محتوای add_book_entry را از ابتدا تا انتها پاک کنید.
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)
یک متد تعریف کنید، remove_book(). عنوان کتاب را استخراج کنید و بررسی کنید که آیا در لیست کتاب ها وجود دارد یا خیر. اگر وجود دارد، آن و سابقه آن را از فرهنگ لغت حذف کنید. پس از انجام، یک کادر پیام موفقیت آمیز نمایش داده می شود که به شما اطلاع می دهد که برنامه کتاب را حذف کرده است. در غیر این صورت، یک کادر پیغام خطا نشان دهید که کتاب پیدا نشد. ورودی 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)
یک متد را تعریف کنید (). عنوان کتاب را استخراج کنید و بررسی کنید که آیا در لیست کتاب ها وجود دارد یا خیر. اگر بله، این را به لیست lend_list اضافه کنید و آن را از لیست کتاب ها حذف کنید. ارزش کتاب را همانطور که منتشر شده به روز کنید. در غیر این صورت، یک کادر پیغام خطا نشان دهید که کتاب پیدا نشد. محتویات () 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)
یک متد تعریف کنید, return_book(). عنوان را استخراج کنید و بررسی کنید که آیا در لیست lend_list وجود دارد یا خیر. اگر بله، آن را حذف کنید و دوباره به فهرست کتاب ها اضافه کنید و مقدار را در رکورد به عنوان بازگشت به روز کنید. یک جعبه پیام موفقیت آمیز نشان دهید که شخص کتاب را برگردانده است.
اگر عنوان در فهرست کتاب وجود دارد و وضعیت رکورد خوانده شده اضافه شده است، یک کادر پیغام خطا نشان می دهد که شخص نمی تواند کتاب را پس دهد زیرا کسی آن را صادر نکرده است. در غیر این صورت، یک کادر پیغام خطا نشان دهید که کتاب پیدا نشد.
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)
یک متد تعریف کنید، view_books(). متغیر پیام را به صورت خالی مقداردهی کنید. پیام را برای انجام درون یابی رشته ای بسازید و عنوان کتاب ها را به همراه وضعیت آنها نمایش دهید. اگر پیام خالی است، هیچ کتابی در دسترس نیست. خروجی مربوطه را در یک جعبه پیام نمایش دهید.
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)
یک نمونه از کلاس ایجاد کنید و تا زمانی که پنجره را ببندید، mainloop() Tkinter را برای گوش دادن به رویدادها اجرا کنید. برای اجرای برنامه از اصطلاح __name__ == “__main__” استفاده کنید.
def run(self):
self.master.mainloop()
if __name__ == "__main__":
book_borrowing_system = BookBorrowingSystem()
book_borrowing_system.run()
نمونه خروجی سیستم امانت کتاب
هنگام اجرای برنامه، با یک صفحه ثبت نام/ورود به شما خوش آمد می گوید. با وارد کردن اطلاعات کاربری و کلیک بر روی دکمه ثبت نام، برنامه شما را به عنوان کتابدار اضافه می کند. با وارد کردن همان مشخصات و زدن گزینه Login به صفحه مدیریت هدایت می شوید.
با وارد کردن عنوان کتاب و فشردن دکمه Add Book، برنامه باکس پیغامی مبنی بر اینکه کتاب را با موفقیت اضافه کرده است نمایش می دهد. اگر روی دکمه مشکل، بازگشت یا حذف کلیک کنید، برنامه در حین به روز رسانی وضعیت، کادر پیام مناسب را نمایش می دهد.
با کلیک بر روی دکمه View Books، برنامه عنوان کتاب ها را به همراه وضعیت آنها نمایش می دهد. اگر کتابی را حذف کنید، برنامه عنوان آن را حذف می کند و شما نمی توانید آن را مشاهده کنید.
در صورتی که سعی کنید کتابی را بدون صدور آن برگردانید یا کتابی را در حین صدور حذف کنید، برنامه باکس پیغام خطا را نمایش می دهد.
تقویت اپلیکیشن قرض گرفتن کتاب
این پیاده سازی پایه ای برای ایجاد یک برنامه رابط کاربری گرافیکی ایمن در سطح تولید است. میتوانید عملکرد آن را با اجرای اعتبارسنجی ورودی، استفاده از hashlib برای ذخیره رمزهای عبور، پیادهسازی مدیریت صحیح خطا، و افزودن ماندگاری دادهها با پایگاه داده افزایش دهید.
جدا از این، شما باید سطوح احراز هویت کاربر را با سطوح مختلف دسترسی برای خوانندگان، کتابداران و مدیران پیاده سازی کنید. میتوانید قابلیت جستجو را برای جستجوی کتابها اضافه کنید و دسترسی به آنها را آسانتر کنید.