پروژه مدیریت کارمندان با Tkinter (اولین تجربه کار با Tkinter)

مدیریت کارمندان

همیشه وقتی یه چیز جدید با پایتون یاد می‌گیرم، دوست دارم یه پروژه کوچیک باهاش بزنم که هم یادم نره و هم یه چیز کاربردی ساخته باشم. این بار قرعه به نام کتابخونه Tkinter افتاد که برای ساختن اپلیکیشن‌های دسکتاپ با پایتون استفاده می‌شه.

گفتم چی بهتر از یه برنامه ساده برای مدیریت اطلاعات کارمندها یا مدیریت کارمندان؟ برنامه‌ای که بشه توش کارمند جدید اضافه کرد، لیست همشون رو دید و دنبال یه نفر خاص گشت. برای ذخیره داده‌ها هم از فایل اکسل استفاده کردم که کار باهاش برای همه راحت باشه.

نتیجه نهایی شد این برنامه کوچیک و جمع‌وجور:

پروژه مدیریت کارمندان با tkinter

تو این مقاله می‌خوام یه گپ خودمونی بزنیم و براتون تعریف کنم که این برنامه مدیریت کارمندان رو چطوری ساختم و با چه چالش‌هایی روبرو شدم.

ابزارهایی که استفاده کردم

برای این پروژه خیلی خودم رو اذیت نکردم و رفتم سراغ ابزارهای ساده و دم‌دستی:

  • پایتون ۳: خب این که اصل ماجراست!
  • کتابخونه Tkinter: چون استاندارد خود پایتونه و نیازی به نصب چیز اضافه‌ای نداره. برای ساختن دکمه‌ها، فیلدهای متنی و کلاً ظاهر برنامه ازش استفاده کردم.
  • کتابخونه openpyxl: یه کتابخونه خیلی خفن برای کار با فایل‌های اکسل (.xlsx). باهاش خیلی راحت می‌شه اطلاعات رو تو فایل اکسل نوشت یا ازش خوند.

چالش‌ها و راه‌حل‌ها (قسمت باحال ماجرا!)

هر پروژه‌ای، حتی کوچیک، چالش‌های خودش رو داره. اینا چندتا از مواردی بود که باهاشون سر و کله زدم:

۱. کاربر فایل داده رو کجا ذخیره کنه؟ 💡

اولش می‌خواستم اسم فایل رو توی کد ثابت بذارم (مثلاً data.xlsx). ولی بعد گفتم اینطوری که کاربر رو محدود می‌کنم! شاید یکی بخواد فایلش رو روی دسکتاپش ذخیره کنه، یکی دیگه توی یه پوشه دیگه.

راه‌حل چی بود؟ استفاده از filedialog خود Tkinter. این ماژول یه پنجره استاندارد “Save As” باز می‌کنه و به کاربر اجازه می‌ده خودش انتخاب کنه فایلش با چه اسمی و کجا ذخیره بشه. خیلی شیک و حرفه‌ای!

این تیکه کد همون کاریه که گفتم رو انجام می‌ده:

from tkinter import filedialog

def select_file(self):
    # این تابع پنجره انتخاب فایل رو باز می‌کنه
    path = filedialog.asksaveasfilename(
        defaultextension=".xlsx",
        filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")]
    )

    # اگه کاربر فایلی رو انتخاب کرد، مسیرش رو ذخیره می‌کنیم
    if path:
        self.filepath = path
        self.lbl_filepathe.config(text=f"فایل فعلی: {path}", fg="green")

۲. اگه کاربر اول فایل رو انتخاب نکرد چی؟ 🛡️

یه مشکل دیگه این بود: اگه کاربر برنامه رو باز کنه و قبل از اینکه فایلی رو انتخاب کنه، روی دکمه “ذخیره” یا “جستجو” کلیک کنه، برنامه با خطا مواجه می‌شد. چون اصلاً نمی‌دونست اطلاعات رو کجا باید ذخیره کنه یا از کجا بخونه!

راه‌حل چی بود؟ یه تابع کمکی کوچیک نوشتم به اسم _check_filepath. وظیفه این تابع اینه که قبل از انجام هر کاری، چک کنه آیا مسیری برای فایل تعریف شده یا نه. اگه نشده بود، یه پیغام خوشگل به کاربر نشون می‌ده و اجازه نمی‌ده بقیه کد اجرا بشه. به این کار میگن “برنامه‌نویسی تدافعی”!

def _check_filepath(self):
    # چک می‌کنه که آیا فایلی انتخاب شده؟
    if not self.filepath:
        messagebox.showwarning('هشدار', 'لطفا ابتدا یک فایل داده را انتخاب یا ایجاد نمایید.')
        return False
    return True

# نحوه استفاده در تابع ذخیره:
def save_employee_data(self):
    # اولین خط کد، چک کردن فایل!
    if not self._check_filepath():
        return # اگه فایلی نبود، از تابع خارج شو

    # ... بقیه کد ذخیره‌سازی

۳. لیست کارمندها چطوری خودکار آپدیت بشه؟ 🔄

تصور کن یه کارمند جدید اضافه می‌کنی، ولی اسمش تو لیست نمیاد تا وقتی که برنامه رو ببندی و دوباره باز کنی! خیلی ضد حاله، نه؟ می‌خواستم لیست کارمندها بلافاصله بعد از هر تغییر (مثل اضافه کردن یه نفر جدید) آپدیت بشه.

راه‌حل چی بود؟ یه استراتژی ساده: پاک کن و دوباره بنویس! تابع display_employees دقیقاً همین کار رو می‌کنه. اول با دستور self.listbox.delete(0, tk.END) کل لیست رو خالی می‌کنه. بعد میره سراغ فایل اکسل، تمام سطرها رو یکی‌یکی می‌خونه و دوباره به لیست اضافه می‌کنه. این تابع رو هر بار بعد از ذخیره کردن یه کارمند جدید صدا می‌زنم و اینطوری لیست همیشه به‌روزه!

def display_employees(self):
    if not self._check_filepath():
        return

    # ۱. کل لیست رو پاک کن
    self.listbox.delete(0, tk.END)

    # ... (کد مربوط به چک کردن وجود فایل)

    workbook = openpyxl.load_workbook(self.filepath)
    sheet = workbook.active

    # ۲. دوباره از فایل بخون و به لیست اضافه کن
    for row in sheet.iter_rows(min_row=2, values_only=True):
        if row[0] is None:
            continue
        display_text = f"کد: {row[0]} | نام: {row[1]} | حقوق: {row[2]}"
        self.listbox.insert(tk.END, display_text)

قدم‌های بعدی چیه؟ 🚀

این برنامه کار راه بندازه، ولی هنوز کلی جای پیشرفت داره. دوتا ایده‌ای که برای آینده تو ذهنمه ایناست:

  1. قابلیت ویرایش اطلاعات: یه دکمه “ویرایش” اضافه کنم که بشه اطلاعات یه کارمند رو تغییر داد.
  2. قابلیت حذف کارمند: یه دکمه “حذف” هم لازمه تا بشه یه نفر رو از لیست پاک کرد.

 

پیشنهاد مطالعه: 50 تا از رایج ترین سوالات مصاحبه برنامه نویسی که باید بدونید | قسمت اول

پیشنهاد مطالعه: راهنمای مذاکره با کارفرما برای برنامه نویس ها (نکات مهم برای حقوق و قرارداد)

حرف آخر و کد پروژه

ساختن این پروژه یه تجربه خیلی خوب و آموزنده بود. با یه پروژه کوچیک، کلی مفهوم مثل کار با فایل، مدیریت رابط کاربری و کنترل خطاهای احتمالی رو تمرین کردم.

اگه دوست داشتی کد کامل پروژه رو ببینی یا خودت اجراش کنی، می‌تونی از لینک گیتهاب زیر دریافتش کنی. خوشحال میشم نظرت رو در موردش بشنوم! 👇

[لینک پروژه مدیریت کارمندان در گیت هاب ]

ممنون که وقت گذاشتی و این پست خودمونی رو خوندی!

نظری درج کنید:

ایمیل شما جایی نمایش یا منتشر داده نمیشه.

یک × یک =