پایتون, طراحی سایت و برنامه نویسی, مقالات

سورس برنامه مدیریت فروشگاه در پایتون + Tkinter و SQLite

پروژه عملی پایتون | مناسب تمرین آزمون فنی‌وحرفه‌ای

آموزش ساخت برنامه مدیریت فروشگاه با پایتون و Tkinter؛ سورس کد کامل با توضیحات فارسی

در این آموزش پایتون، ساخت پروژه مدیریت فروشگاه با پایتون را قدم‌به‌قدم یاد می‌گیریم؛ برنامه‌ای کاربردی برای ثبت، جستجو، حذف و ویرایش کالا. رابط گرافیکی برنامه با Tkinter ساخته می‌شود و اطلاعات کالاها در پایگاه داده SQLite ذخیره می‌شوند. این سورس کد پایتون با توضیحات فارسی، برای تمرین برنامه‌نویسی، یادگیری کار با دیتابیس و آمادگی بیشتر برای آزمون عملی پایتون فنی‌وحرفه‌ای مناسب است.

PythonTkinterSQLiteCRUDآزمون عملی فنی‌وحرفه‌ای
در این آموزش چه یاد می‌گیریم؟

ساخت پنجره گرافیکی، دریافت اطلاعات از Entry، نمایش رکوردها در Listbox، اتصال پایتون به SQLite، عملیات افزودن، جستجو، حذف و ویرایش و بررسی خطاهای ورودی.

۱. نمای خروجی برنامه مدیریت فروشگاه

رابط کاربری این تمرین شامل چهار ورودی برای نام کالا، قیمت خرید، قیمت فروش و تعداد است. کالاهای ثبت‌شده در فهرست نمایش داده می‌شوند و دکمه‌ها عملیات اصلی را انجام می‌دهند.

تصویر خروجی برنامه مدیریت فروشگاه با پایتون و Tkinter شامل افزودن، جستجو، حذف و ویرایش کالا

۲. ابزارهای موردنیاز برای اجرای پروژه

Pythonزبان اصلی برنامه‌نویسی و اجرای منطق مدیریت کالاها.
Tkinterکتابخانه ساخت پنجره، برچسب، کادر ورودی، فهرست و دکمه‌ها.
SQLiteپایگاه داده سبک که اطلاعات را در فایل محلی t10.db نگه می‌دارد.
ویرایشگر کدمی‌توانید از IDLE، VS Code یا هر ویرایشگر پایتون استفاده کنید.

کد را در فایلی با نام market.py ذخیره کنید و در همان پوشه دستور python market.py را اجرا کنید. ماژول sqlite3 همراه نصب استاندارد پایتون است.

۳. منطق کلی برنامه چگونه کار می‌کند؟

برنامه از دو بخش اصلی تشکیل شده است: رابط گرافیکی برای دریافت اطلاعات و پایگاه داده برای نگهداری دائمی آن‌ها.

افزودن کالااطلاعات ورودی بررسی می‌شوند و با دستور INSERT در جدول ذخیره می‌شوند.
نمایش کالاهاتابع show رکوردها را می‌خواند و در Listbox نمایش می‌دهد.
انتخاب و ویرایشبا انتخاب یک ردیف، شناسه کالا و اطلاعات آن در ورودی‌ها قرار می‌گیرد.
جستجو و حذفجستجو بر اساس نام انجام می‌شود و حذف با شناسه یکتای کالا صورت می‌گیرد.

ستون id شناسه یکتای هر کالا است؛ بنابراین حتی اگر دو کالا نام یکسانی داشته باشند، می‌توان رکورد درست را ویرایش یا حذف کرد.

۴. سورس کد کامل برنامه مدیریت فروشگاه با پایتون

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

نکته آموزشی: حذف و ویرایش فقط وقتی انجام می‌شوند که یک کالا انتخاب شده باشد. نام کالا نباید خالی باشد و قیمت‌ها و تعداد باید عدد صحیح و غیرمنفی باشند.
market.py — سورس کامل با کامنت فارسی
from tkinter import *
from tkinter import messagebox
import sqlite3

# اتصال به پایگاه داده؛ اگر فایل وجود نداشته باشد ساخته می‌شود.
conn = sqlite3.connect('t10.db')
curs = conn.cursor()

# ساخت جدول کالاها، فقط اگر از قبل وجود نداشته باشد.
# id شناسه یکتای هر کالا است و خودکار افزایش می‌یابد.
curs.execute(
    'CREATE TABLE IF NOT EXISTS market ('
    'id INTEGER PRIMARY KEY AUTOINCREMENT, '
    'namkala TEXT, kharid INTEGER, forosh INTEGER, tedad INTEGER)'
)
conn.commit()

# شناسه کالایی که کاربر انتخاب می‌کند در این متغیر نگه داشته می‌شود.
kod = None


def pak_kardan():
    """خالی کردن چهار کادر ورودی."""
    e1.delete(0, END)
    e2.delete(0, END)
    e3.delete(0, END)
    e4.delete(0, END)
    e1.focus_set()


def gereftan_etelaat():
    """خواندن ورودی‌ها و بررسی درست بودن آن‌ها."""
    nam = e1.get().strip()
    kh = e2.get().strip()
    fo = e3.get().strip()
    ted = e4.get().strip()

    # نام کالا نباید خالی باشد.
    if not nam:
        messagebox.showwarning('خطای ورودی', 'نام کالا را وارد کنید.')
        e1.focus_set()
        return None

    # تبدیل قیمت‌ها و تعداد از متن به عدد صحیح.
    try:
        kh = int(kh)
        fo = int(fo)
        ted = int(ted)
    except ValueError:
        messagebox.showwarning(
            'خطای ورودی',
            'قیمت خرید، قیمت فروش و تعداد باید عدد صحیح باشند.'
        )
        return None

    # در این تمرین مقدار منفی مجاز نیست.
    if kh < 0 or fo < 0 or ted < 0:
        messagebox.showwarning(
            'خطای ورودی',
            'قیمت‌ها و تعداد نمی‌توانند منفی باشند.'
        )
        return None

    return nam, kh, fo, ted


def show():
    """نمایش همه کالاهای ذخیره‌شده در فهرست."""
    mylist.delete(0, END)
    curs.execute('SELECT * FROM market ORDER BY id')
    info = curs.fetchall()

    # هر ردیف شامل id، نام، قیمت خرید، قیمت فروش و تعداد است.
    for item in info:
        mylist.insert(END, item)


def add():
    """افزودن کالای جدید به پایگاه داده."""
    global kod
    info = gereftan_etelaat()
    if info is None:
        return

    nam, kh, fo, ted = info

    # علامت سؤال‌ها جای مقادیر را مشخص می‌کنند.
    curs.execute(
        'INSERT INTO market (namkala, kharid, forosh, tedad) '
        'VALUES (?, ?, ?, ?)',
        (nam, kh, fo, ted)
    )
    conn.commit()

    kod = None
    pak_kardan()
    show()
    messagebox.showinfo('ثبت کالا', 'کالا با موفقیت اضافه شد.')


def entekhab(event=None):
    """انتقال اطلاعات ردیف انتخاب‌شده به کادرهای ورودی."""
    global kod
    entekhabha = mylist.curselection()

    # اگر هیچ ردیفی انتخاب نشده باشد، تابع متوقف می‌شود.
    if not entekhabha:
        return

    # گرفتن اطلاعات ردیف انتخاب‌شده از Listbox
    neveshte = mylist.get(entekhabha[0])
    kod = neveshte[0]  # ذخیره شناسه یکتای کالا

    pak_kardan()
    e1.insert(0, neveshte[1])
    e2.insert(0, neveshte[2])
    e3.insert(0, neveshte[3])
    e4.insert(0, neveshte[4])


def hazf():
    """حذف کالای انتخاب‌شده."""
    global kod

    if kod is None:
        messagebox.showwarning(
            'حذف کالا', 'ابتدا یک کالا را از فهرست انتخاب کنید.'
        )
        return

    # قبل از حذف، از کاربر تأیید می‌گیریم.
    if not messagebox.askyesno(
        'تأیید حذف', 'آیا از حذف کالای انتخاب‌شده مطمئن هستید؟'
    ):
        return

    # دستور درست SQL برای حذف، DELETE FROM است.
    curs.execute('DELETE FROM market WHERE id = ?', (kod,))
    conn.commit()

    kod = None
    pak_kardan()
    show()
    messagebox.showinfo('حذف کالا', 'کالا حذف شد.')


def edit():
    """ویرایش اطلاعات کالای انتخاب‌شده."""
    global kod

    if kod is None:
        messagebox.showwarning(
            'ویرایش کالا', 'ابتدا یک کالا را از فهرست انتخاب کنید.'
        )
        return

    info = gereftan_etelaat()
    if info is None:
        return

    nam, kh, fo, ted = info
    curs.execute(
        'UPDATE market SET namkala = ?, kharid = ?, '
        'forosh = ?, tedad = ? WHERE id = ?',
        (nam, kh, fo, ted, kod)
    )
    conn.commit()

    kod = None
    pak_kardan()
    show()
    messagebox.showinfo('ویرایش کالا', 'اطلاعات کالا به‌روزرسانی شد.')


def search():
    """جستجوی کالا با تمام یا بخشی از نام آن."""
    nam = e1.get().strip()
    mylist.delete(0, END)

    if nam:
        # LIKE همراه درصد، جستجوی بخشی از نام را ممکن می‌کند.
        curs.execute(
            'SELECT * FROM market WHERE namkala LIKE ? ORDER BY id',
            ('%' + nam + '%',)
        )
    else:
        # اگر کادر نام خالی باشد، همه کالاها نمایش داده می‌شوند.
        curs.execute('SELECT * FROM market ORDER BY id')

    for item in curs.fetchall():
        mylist.insert(END, item)


def baste():
    """بستن اتصال پایگاه داده و پنجره برنامه."""
    conn.close()
    win.destroy()


# ---------------- ساخت رابط گرافیکی ----------------
win = Tk()
win.geometry('500x400')
win.title('مدیریت فروشگاه')
win.resizable(False, False)

Label(win, text='نام کالا').place(x=50, y=40)
Label(win, text='قیمت خرید').place(x=250, y=40)
Label(win, text='قیمت فروش').place(x=50, y=80)
Label(win, text='تعداد').place(x=250, y=80)

# کادرهای ورود اطلاعات
e1 = Entry(win)
e1.place(x=120, y=40)

e2 = Entry(win)
e2.place(x=320, y=40)

e3 = Entry(win)
e3.place(x=120, y=80)

e4 = Entry(win)
e4.place(x=320, y=80)

# فهرست نمایش کالاها
mylist = Listbox(win)
mylist.place(x=50, y=120, width=200, height=195)

# با انتخاب یک ردیف، تابع entekhab اجرا می‌شود.
mylist.bind( '<>' ,  entekhab )

# دکمه‌های برنامه
Button(win, text='افزودن', command=add).place(x=320, y=120, width=100)
Button(win, text='جستجو', command=search).place(x=320, y=160, width=100)
Button(win, text='حذف', command=hazf).place(x=320, y=200, width=100)
Button(win, text='ویرایش', command=edit).place(x=320, y=240, width=100)
Button(win, text='بستن', command=baste).place(x=320, y=280, width=100)

# نمایش کالاهای قبلی هنگام اجرای برنامه
show()

# اجرای حلقه اصلی برنامه
win.mainloop()

۵. توضیح ساده بخش‌های مهم کد

اتصال به SQLite و ساخت جدول

با sqlite3.connect('t10.db') به فایل پایگاه داده وصل می‌شویم. اگر فایل وجود نداشته باشد، SQLite آن را می‌سازد. دستور CREATE TABLE IF NOT EXISTS جدول کالاها را فقط در صورت نیاز ایجاد می‌کند.

چرا از commit استفاده می‌کنیم؟

بعد از افزودن، ویرایش یا حذف، با conn.commit() تغییرات را در پایگاه داده ثبت می‌کنیم.

چرا شناسه کالا را نگه می‌داریم؟

نام کالا ممکن است تکراری باشد؛ بنابراین برای حذف یا ویرایش از شناسه یکتای id استفاده می‌کنیم. تابع entekhab این شناسه را در متغیر kod قرار می‌دهد.

تفاوت جستجوی دقیق و جستجوی بخشی

در نسخه اولیه شرط namkala = ? فقط نام کاملاً یکسان را پیدا می‌کرد. در نسخه تکمیل‌شده، LIKE و علامت درصد اجازه می‌دهند بخشی از نام را وارد کنید.

چرا از try و except استفاده می‌کنیم؟

مقادیر Entry در ابتدا متن هستند. با int() آن‌ها را به عدد صحیح تبدیل می‌کنیم. اگر کاربر به‌جای عدد حروف وارد کند، except ValueError پیام خطا نشان می‌دهد و برنامه بی‌دلیل متوقف نمی‌شود.

۷. سؤالات متداول درباره پروژه مدیریت فروشگاه با پایتون

آیا این پروژه برای آزمون عملی پایتون فنی‌وحرفه‌ای مناسب است؟

این پروژه تمرین مناسبی برای مرور Tkinter، توابع، رویدادها، SQL و عملیات افزودن، نمایش، جستجو، حذف و ویرایش است؛ اما تضمینی نیست که همین پروژه عیناً در آزمون مطرح شود.

آیا اطلاعات کالاها پس از بستن برنامه باقی می‌مانند؟

بله. اطلاعات در فایل t10.db ذخیره می‌شوند و با اجرای دوباره برنامه خوانده خواهند شد، به شرط آنکه فایل حذف یا جابه‌جا نشده باشد.

آیا برای SQLite باید کتابخانه‌ای نصب کنیم؟

خیر. ماژول sqlite3 همراه نصب استاندارد پایتون است. Tkinter نیز معمولاً همراه پایتون نصب می‌شود؛ در بعضی توزیع‌ها ممکن است نصب جداگانه لازم باشد.

چرا باید کالا را از فهرست انتخاب کنم؟

انتخاب کالا باعث می‌شود شناسه یکتای آن مشخص شود؛ سپس برنامه می‌تواند دقیقاً همان رکورد را حذف یا ویرایش کند.

آیا قیمت‌ها با جداکننده هزارگان نمایش داده می‌شوند؟

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

برنامه‌نویسی را با پروژه واقعی یاد بگیرید

در آموزشگاه کامپیوتر راهکار، یادگیری برنامه‌نویسی با تمرین و ساخت پروژه همراه است. برای آشنایی با دوره‌های پایتون و دریافت راهنمایی درباره مسیر یادگیری با آموزشگاه تماس بگیرید.

آدرس: تبریز، خیابان شهناز، نرسیده به تقاطع ۱۷ شهریور

در این آموزش پروژه مدیریت فروشگاه با پایتون، مفاهیم برنامه‌نویسی پایتون، طراحی رابط گرافیکی با Tkinter، ذخیره اطلاعات با SQLite و عملیات CRUD را تمرین می‌کنید. اگر به دنبال سورس کد پایتون با توضیحات فارسی، نمونه پروژه پایتون برای آزمون فنی‌وحرفه‌ای یا آموزش برنامه‌نویسی در تبریز هستید، این پروژه نقطه شروع مناسبی برای تمرین عملی است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *