ساخت دفترچه تلفن با Python و CustomTkinter

آموزش ساخت دفترچه تلفن مدرن با پایتون و CustomTkinter

پروژه ۲ دقیقه مطالعه
فهرست مطالب
این مطلب از سایت tool.hamidvalad.ir گرفته شده است

معرفی

در این آموزش یک دفترچه تلفن دسکتاپ با استفاده از Python و کتابخانه CustomTkinter می‌سازیم. این برنامه امکان مدیریت مخاطبان شامل افزودن، ویرایش، حذف و جستجو را فراهم می‌کند. رابط کاربری کاملاً فارسی است و از تم تاریک برای تجربه بهتر استفاده می‌کند.

نصب و پیش‌نیازها

برای اجرای این پروژه نیاز به نصب Python 3.6 یا بالاتر و کتابخانه CustomTkinter دارید. Tkinter معمولاً به‌صورت پیش‌فرض روی پایتون نصب است. با دستور زیر CustomTkinter را نصب کنید:

pip install customtkinter

راه‌اندازی گام‌به‌گام

مرحله ۱: نصب کتابخانه‌ها

ابتدا مطمئن شوید CustomTkinter روی سیستم شما نصب شده است.

مرحله ۲: ایجاد فایل پروژه

یک فایل با نام phonebook.py ایجاد کنید.

مرحله ۳: کپی کردن کد

کد کامل پروژه را در فایل قرار دهید.

مرحله ۴: اجرای پروژه

فایل را اجرا کنید تا رابط کاربری دفترچه تلفن باز شود.

کدنویسی پروژه

در این بخش کد کامل پروژه قرار دارد که می‌توانید آن را مستقیماً در فایل خود کپی کنید:

import customtkinter as ctk
import tkinter.messagebox as msg

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")

root = ctk.CTk()
root.title("دفترچه تلفن کوچک")
root.geometry("500x550")

contacts = []

def validate_phone(P):
    return P.isdigit() and len(P) <= 11 or P == ""

def add_contact():
    name = name_entry.get().strip()
    phone = phone_entry.get().strip()
    if not name or not phone:
        msg.showwarning("هشدار", "لطفاً نام و شماره را وارد کنید!")
        return
    contacts.append({"Name": name, "Phone": phone})
    update_textbox()
    name_entry.delete(0, ctk.END)
    phone_entry.delete(0, ctk.END)

def delete_contact():
    try:
        selected_line = textbox.get("sel.first", "sel.last").strip()
    except:
        msg.showwarning("هشدار", "لطفاً یک مخاطب انتخاب کنید!")
        return
    for c in contacts:
        if f"{c['Name']} - {c['Phone']}" == selected_line:
            contacts.remove(c)
            break
    update_textbox()

def edit_contact():
    try:
        selected_line = textbox.get("sel.first", "sel.last").strip()
    except:
        msg.showwarning("هشدار", "لطفاً یک مخاطب انتخاب کنید!")
        return
    for c in contacts:
        if f"{c['Name']} - {c['Phone']}" == selected_line:
            new_name = name_entry.get().strip()
            new_phone = phone_entry.get().strip()
            if not new_name or not new_phone:
                msg.showwarning("هشدار", "نام و شماره جدید را وارد کنید!")
                return
            c['Name'] = new_name
            c['Phone'] = new_phone
            break
    update_textbox()
    name_entry.delete(0, ctk.END)
    phone_entry.delete(0, ctk.END)

def update_textbox():
    contacts.sort(key=lambda x: x['Name'])
    textbox.delete("0.0", ctk.END)
    persian_letters = "ا ب پ ت ث ج چ ح خ د ذ ر ز ژ س ش ص ض ط ظ ع غ ف ق ک گ ل م ن و ه ی"
    textbox.insert(ctk.END, "🔤 حروف الفبا فارسی: " + persian_letters + "\n\n")
    
    search_text = search_entry.get().strip()
    for c in contacts:
        if search_text in c['Name'] or search_text in c['Phone']:
            textbox.insert(ctk.END, f"{c['Name']} - {c['Phone']}\n")

def search_contact(*args):
    update_textbox()

name_entry = ctk.CTkEntry(root, placeholder_text="نام ")
name_entry.pack(pady=5, padx=10, fill=ctk.X)

vcmd = (root.register(validate_phone), "%P")
phone_entry = ctk.CTkEntry(root, placeholder_text="شماره تلفن را وارد کنید", validate="key", validatecommand=vcmd)
phone_entry.pack(pady=5, padx=10, fill=ctk.X)

frame_buttons = ctk.CTkFrame(root)
frame_buttons.pack(pady=5, padx=10, fill=ctk.X)

add_btn = ctk.CTkButton(frame_buttons, text="افزودن", command=add_contact)
add_btn.pack(side=ctk.LEFT, expand=True, fill=ctk.X, padx=5)

edit_btn = ctk.CTkButton(frame_buttons, text="ویرایش", command=edit_contact)
edit_btn.pack(side=ctk.LEFT, expand=True, fill=ctk.X, padx=5)

delete_btn = ctk.CTkButton(frame_buttons, text="حذف", command=delete_contact)
delete_btn.pack(side=ctk.LEFT, expand=True, fill=ctk.X, padx=5)

search_entry = ctk.CTkEntry(root, placeholder_text="جستجو بر اساس نام یا شماره")
search_entry.pack(pady=5, padx=10, fill=ctk.X)
search_entry.bind("", search_contact)

textbox = ctk.CTkTextbox(root, height=300)
textbox.pack(pady=10, padx=10, fill=ctk.BOTH, expand=True)

scrollbar = ctk.CTkScrollbar(root, command=textbox.yview)
textbox.configure(yscrollcommand=scrollbar.set)
scrollbar.pack(side=ctk.RIGHT, fill=ctk.Y)

root.mainloop()

نحوه اجرا

برای اجرای برنامه مراحل زیر را انجام دهید:

  1. فایل phonebook.py را ذخیره کنید.
  2. ترمینال را باز کنید.
  3. به مسیر فایل بروید.
  4. دستور زیر را اجرا کنید:
python phonebook.py

شرح بخش‌های مهم کد

در این بخش خلاصه‌ای از عملکرد قسمت‌های مهم پروژه را توضیح می‌دهیم.

۱. وارد کردن کتابخانه‌ها

کتابخانه‌های CustomTkinter و messagebox برای ساخت رابط گرافیکی و نمایش هشدارها استفاده می‌شوند.

۲. تنظیمات اولیه

تم برنامه روی حالت تاریک تنظیم شده و رنگ اصلی روی آبی قرار دارد.

۳. لیست مخاطبان

اطلاعات مخاطبان داخل یک لیست ذخیره می‌شود که شامل نام و شماره تلفن است.

۴. اعتبارسنجی شماره تلفن

فقط ورود اعداد مجاز است و طول شماره نباید بیش از ۱۱ رقم باشد.

۵. توابع اصلی پروژه

  • افزودن مخاطب جدید
  • حذف مخاطب انتخاب‌شده
  • ویرایش اطلاعات مخاطب
  • به‌روزرسانی لیست مخاطبان
  • جستجوی لحظه‌ای میان مخاطبان

عیب‌یابی و نکات مهم

مشکلات رایج:

  • خطای نبود کتابخانه: CustomTkinter را نصب کنید.
  • نمایش نادرست فارسی: از پشتیبانی Unicode مطمئن شوید.
  • انتخاب اشتباه خط: باید متن کامل انتخاب شود.
  • عدم ذخیره مخاطبان: داده‌ها فقط در حافظه‌اند.

منابع و مستندات

• مستندات CustomTkinter • مستندات Tkinter • آموزش‌های Python GUI